【发布时间】:2016-10-11 06:02:19
【问题描述】:
IEEE-754 64 位双精度浮点不能表示整数9007199254740995,而是存储9007199254740996。为什么不9007199254740994?
我想知道什么规则定义了这个过程?整数是否四舍五入?为rounding numbers with fractional parts 定义的舍入规则是否也适用于整数?
我认为 JS 不会简单地丢弃不能放入尾数的位。二进制数9007199254740995表示为:
1 0000000000000000000000000000000000000000000000000001 1
| 52 bits |
----------------------------------------------------
不存储第一个隐式位。所以如果 JS 简单地丢弃了无法存储的位,我们将在 51 后面加上 1,这将导致数字 9007199254740994。但是我们有50 zeros followed by 10:
1 0000000000000000000000000000000000000000000000000010 0
| 52 bits |
----------------------------------------------------
这是号码9007199254740996。所以必须进行一些其他的转变。
【问题讨论】:
-
因为它没有足够的空间来存储最后一位。数字具有 53 位精度。正确表示
9007199254740993需要 54 位。没有最后一点,它是9007199254740992 -
@Thomas,是的,请看我在问题末尾的注释
-
没有四舍五入,JS 只是用完了空间来写入正确描述该数字所需的位,并且您会得到没有这些位的结果。也许我不明白你的问题,因为如果你明白为什么这个数字不能按原样存储,那么你在问什么?
-
@Thomas,请看我的更新
-
您没有在问题中混淆 9007199254740992 和 9007199254740994 的位模式吗?
标签: javascript floating-point ieee-754