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

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为底的重复“十进制”。

  • 十进制: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 时,它对您没有帮助。

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

    10-11 18:02