当然,有些整数不能表示为双精度浮点数。
Pow(2, 53)所有不超过或9007199254740992的整数都是可表示的。从Pow(2, 53)到Pow(2, 54)(即18014398509481984),只能表示偶数。奇数将被四舍五入。
当然,它会继续这样。从Pow(2, 54)到Pow(2, 55)只有 4 的倍数(4 除的整数)是可表示的,从Pow(2, 55)到Pow(2, 56)只有 8 的倍数,依此类推。
这是因为双精度浮点格式的尾数(有效位)有 53 位(二进制位)。
很容易验证我的说法。例如,将数字10000000000000001作为integer64. 将其转换double为integer64. 你会看到精度损失。
当您采用非常大的双精度数时,肯定只有很小百分比的整数是可表示的。例如,在附近1E+300(在Pow(2, 996)和之间),我们正在谈论( )Pow(2, 997)的倍数。这与 a精确到大约 16 位小数这一事实是一致的。因此,一个包含 300 个数字的整数将仅在其第一个近似值时被“记住”。16 个数字(实际上是 53 个二进制数字)。Pow(2, 944)1.4870169084777831E+284double
加法:不能完全表示的十的第一个幂是1E+23(或 100 六分之一,短尺度命名风格)。在该数字附近,只能表示16777216(即Pow(2, 24)) 的整数倍,但 10 的 23 次方显然不是 2 的 24 次方的倍数。质因数分解是10**23 == 2**23 * 5**23,所以我们只能将 2 整除 23 次,而不是要求的 24 次。