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

Pet*_*ter 7 .net c# floating-point types

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

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

Console.WriteLine("decimal x = " + x);
Console.WriteLine("double y = " + y);
Run Code Online (Sandbox Code Playgroud)

结果:

十进制x = 275.99999999999999999999999

双y = 276.0

谁可以给我解释一下这个?我不明白这是怎么回事.

dan*_*n04 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,则对您没有帮助.