如果将以下代码放入编译器,结果会有些奇怪:
decimal x = (276/304)*304;
double y = (276/304)*304;
Console.WriteLine("decimal x = " + x);
Console.WriteLine("double y = " + y);
结果:谁可以给我解释一下这个?我不明白这怎么可能是正确的。
最佳答案
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 时,它对您没有帮助。关于c# - (276/304)*304 的十进制舍入关闭,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5029955/