为什么 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 是偶数,因此结果四舍五入为偶数。
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 是偶数,因此结果四舍五入为偶数。