为什么 9007199254740995 四舍五入为 9007199254740996

Why 9007199254740995 is rounded to 9007199254740996

IEEE-754 64 位双精度浮点数不能表示整数 9007199254740995,而是存储 9007199254740996。为什么不 9007199254740994

我想知道什么规则定义了这个过程?整数会四舍五入吗?为 rounding numbers with fractional parts 定义的舍入规则是否也适用于整数?

我不认为JS会简单地丢弃不能放入尾数的位。数字9007199254740995在二进制中表示为:

1 0000000000000000000000000000000000000000000000000001 1
  |                       52 bits                    |  
  ----------------------------------------------------

未存储第一个隐式位。所以 如果 JS 简单地丢弃无法存储的位,我们将有 51 0 后跟 1,这将导致数字 9007199254740994。但是我们有 50 zeros followed by 10:

1 0000000000000000000000000000000000000000000000000010 0
  |                       52 bits                    |  
  ----------------------------------------------------

这是数字 9007199254740996。所以必须进行一些其他的转换。

是的,所有浮点数的舍入规则完全相同,与是否为整数无关。

当数字无法用格式表示时,四舍五入到最接近的可表示值;如果恰好在两个这样的值之间,则将其四舍五入到最接近的 "even" 数字,即尾数为 0 的数字。

以9007199254740995为例,正好是两个浮点数的中间值:9007199254740994,尾数:

1 0000000000000000000000000000000000000000000000000001

和 9007199254740996,带有效数

1 0000000000000000000000000000000000000000000000000010

在本例中,9007199254740996 是偶数,因此结果四舍五入为偶数。