(276/304)* 304关闭十进制舍入

时间:2011-02-17 14:06:03

标签: c# .net types floating-point

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

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

有人可以向我解释一下吗?我不明白这是怎么回事。

3 个答案:

答案 0 :(得分:10)

276/304 = 69/76是基数10和基数2的重复“小数”。

  • 十进制:0.90(789473684210526315)
  • 二进制:0.11(101000011010111100)

因此结果四舍五入,乘以分母可能不会产生原始分子。这种情况的一个更常见的例子是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... 我知道它以编程方式提出了一些问题,但这并不是一个完全浮点问题。