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
。所以必须进行其他一些转变。
答案 0 :(得分:4)
是的,对于所有浮点数,舍入规则完全相同,并且与它们是否为整数无关。
当数字不能用格式表示时,它会四舍五入到最接近的可表示值;如果它恰好位于两个这样的值之间,则四舍五入到最接近的“偶数”数,即有效数的最后一位为0的那个。
在9007199254740995的情况下,它恰好在两个浮点数之间的中间位置:9007199254740994,带有有效数字:
1 0000000000000000000000000000000000000000000000000001
和9007199254740996,带有意义
1 0000000000000000000000000000000000000000000000000010
在这种情况下,9007199254740996是偶数,因此结果四舍五入。