c#中的奇怪减法

Cic*_*cio 1 c# math

我正在做ac#program ..我必须做一个简单的数学运算.

72057594037927936.0 - 255.0 = .....
Run Code Online (Sandbox Code Playgroud)

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

72057594037927680.0 
Run Code Online (Sandbox Code Playgroud)

代替

72057594037927681.0 
Run Code Online (Sandbox Code Playgroud)

请问有人可以解释一下,怎么可能?

感谢名单

Dan*_*her 16

减法的确切结果,

72057594037927681 = 0xffffffffffff01
Run Code Online (Sandbox Code Playgroud)

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


p.s*_*w.g 6

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

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

// using doubles
72057594037927936.0 - 255.0 // 72057594037927680.0

// using decimals
72057594037927936.0m - 255.0m // 72057594037927681.0m
Run Code Online (Sandbox Code Playgroud)