gpt4 book ai didi

c# - (276/304)*304 的小数舍入关闭

转载 作者:太空狗 更新时间:2023-10-29 20:06:02 26 4
gpt4 key购买 nike

如果将以下代码放入编译器,结果会有点奇怪:

decimal x = (276/304)*304;
double y = (276/304)*304;

Console.WriteLine("decimal x = " + x);
Console.WriteLine("double y = " + y);

结果:

decimal x = 275.99999999999999999999999

double y = 276.0

有人能给我解释一下吗?我不明白这怎么可能是正确的。

最佳答案

276/304 = 69/76 是以 10 为底和以 2 为底的循环“十进制”。

  • 小数:0.90(789473684210526315)
  • 二进制:0.11(101000011010111100)

所以结果四舍五入,乘以分母可能得不到原来的分子。这种情况的一个更常被引用的例子是 1/3*3 = 0.33333333*3 = 0.99999999。

double 版本给出了准确答案纯属巧合。乘法中的舍入误差恰好抵消了除法中的舍入误差。

如果此结果令人困惑,可能是因为您听说过“double 有舍入错误,而 decimal 是精确的”。但是 decimal 仅在表示 decimal 小数时才准确,例如 0.1(二进制为 0.0 0011 0011...)。当分母中有 19 的因数时,它对您没有帮助。

关于c# - (276/304)*304 的小数舍入关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5029955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com