如果将以下代码放入编译器中,结果会有点奇怪:
decimal x = (276/304)*304;
double y = (276/304)*304;
Console.WriteLine("decimal x = " + x);
Console.WriteLine("double y = " + y);
Result:
十进制 x = 275.99999999999999999999999
双 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 时,它对你没有帮助。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)