1

我正在做ac#程序。我必须做一个简单的数学运算。

72057594037927936.0 - 255.0 = .....

两个数字都是双倍的......我得到

72057594037927680.0 

代替

72057594037927681.0 

谁能解释一下,这怎么可能?

谢谢

4

2 回答 2

16

减法的确切结果,

72057594037927681 = 0xffffffffffff01

需要 56 位精度,但double只有 53 位,因此结果会四舍五入到最接近的可表示数字。

于 2013-07-10T22:10:28.520 回答
6

因为浮点数只有有限的精度。从一个大数字中添加/减去一个小数字可能会导致舍入错误。

如果您将代码转换为使用decimal's 代替(更精确但范围更小),您将得到您期望的答案:

// using doubles
72057594037927936.0 - 255.0 // 72057594037927680.0

// using decimals
72057594037927936.0m - 255.0m // 72057594037927681.0m
于 2013-07-10T22:11:21.943 回答