如果在编译器中放入以下代码,结果有点奇怪:
decimal x = (276/304)*304;
double y = (276/304)*304;
Console.WriteLine("decimal x = " + x);
Console.WriteLine("double y = " + y);
结果:
十进制x = 275.99999999999999999999999
双y = 276.0
有人可以向我解释一下吗?我不明白这是怎么回事。
答案 0 :(得分:10)
276/304 = 69/76是基数10和基数2的重复“小数”。
因此结果四舍五入,乘以分母可能不会产生原始分子。这种情况的一个更常见的例子是1/3 * 3 = 0.33333333 * 3 = 0.99999999。
double
版本给出的确切答案只是巧合。乘法中的舍入误差恰好抵消了除法中的舍入误差。
如果此结果令人困惑,可能是因为您听说“double
有舍入错误且decimal
确切”。但decimal
仅在表示十进制分数(如0.1)(二进制为0.0 0011 0011 ...)时才是精确的。如果分母中的因子为19,则对您没有帮助。
答案 1 :(得分:4)
嗯,浮点精度不是100% 例如,请参阅:http://effbot.org/pyfaq/why-are-floating-point-calculations-so-inaccurate.htm
答案 2 :(得分:-2)
好吧,数学上0.99999 ... == 1.看看http://en.wikipedia.org/wiki/0.999... 我知道它以编程方式提出了一些问题,但这并不是一个完全浮点问题。