如果将以下代码放入编译器,结果会有点奇怪:
decimal x = (276/304)*304;
double y = (276/304)*304;
Console.WriteLine("decimal x = " + x);
Console.WriteLine("double y = " + y);
结果:
decimal x = 275.99999999999999999999999
double y = 276.0
有人能给我解释一下吗?我不明白这怎么可能是正确的。
最佳答案
276/304 = 69/76 是以 10 为底和以 2 为底的循环“十进制”。
- 小数:0.90(789473684210526315)
- 二进制:0.11(101000011010111100)
所以结果四舍五入,乘以分母可能得不到原来的分子。这种情况的一个更常被引用的例子是 1/3*3 = 0.33333333*3 = 0.99999999。
double
版本给出了准确答案纯属巧合。乘法中的舍入误差恰好抵消了除法中的舍入误差。
如果此结果令人困惑,可能是因为您听说过“double
有舍入错误,而 decimal
是精确的”。但是 decimal
仅在表示 decimal 小数时才准确,例如 0.1(二进制为 0.0 0011 0011...)。当分母中有 19 的因数时,它对您没有帮助。
关于c# - (276/304)*304 的小数舍入关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5029955/