为什么9007199254740995舍入到9007199254740996

时间:2016-10-11 06:02:19

标签: javascript floating-point ieee-754

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。所以必须进行其他一些转变。

1 个答案:

答案 0 :(得分:4)

是的,对于所有浮点数,舍入规则完全相同,并且与它们是否为整数无关。

当数字不能用格式表示时,它会四舍五入到最接近的可表示值;如果它恰好位于两个这样的值之间,则四舍五入到最接近的“偶数”数,即有效数的最后一位为0的那个。

在9007199254740995的情况下,它恰好在两个浮点数之间的中间位置:9007199254740994,带有有效数字:

1 0000000000000000000000000000000000000000000000000001

和9007199254740996,带有意义

1 0000000000000000000000000000000000000000000000000010

在这种情况下,9007199254740996是偶数,因此结果四舍五入。

相关问题