Javascript 为什么9007199254740995四舍五入为9007199254740996

Javascript 为什么9007199254740995四舍五入为9007199254740996,javascript,floating-point,ieee-754,Javascript,Floating Point,Ieee 754,IEEE-754 64位双精度浮点不能表示整数9007199254740995,而是存储9007199254740996。为什么不9007199254740994 我想知道是什么规则定义了这个过程?整数是四舍五入的吗?定义的舍入规则是否也适用于整数 我不认为JS简单地丢弃了不能放入尾数的部分。二进制数字9007199254740995表示为: 1 0000000000000000000000000000000000000000000000000001 1 |

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

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

我不认为JS简单地丢弃了不能放入尾数的部分。二进制数字9007199254740995表示为:

1 0000000000000000000000000000000000000000000000000001 1
  |                       52 bits                    |  
  ----------------------------------------------------
不存储第一个隐式位。因此,如果JS简单地丢弃了无法存储的位,我们将有51个零后跟1,这将导致数字9007199254740994。但是我们有50个零,后面跟着10:


电话号码是9007199254740996。因此必须进行一些其他转换。

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

当数字不能用格式表示时,将其四舍五入到最接近的可表示值;如果它正好位于两个这样的值的中间,它将四舍五入到最近的偶数,即有效位最后一位为0的偶数

对于9007199254740995,它正好位于两个浮点数的中间:9007199254740994,有效位为:

1 0000000000000000000000000000000000000000000000000001
和9007199254740996,带有效位

1 0000000000000000000000000000000000000000000000000010

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

因为它没有足够的空间来存储最后一位。数字有53位的精度。正确表示9007199254740993需要54位。没有这最后一点,它是9007199254740992@Thomas,是的,请看我在问题末尾的注释没有舍入,JS只是没有足够的空间来写正确描述这个数字所需的位,没有这些位,你就得到了结果。也许我不明白你的问题,因为如果你明白为什么这个数字不能按原样存储,那么你在问什么?@Thomas,请查看我的更新Aven你不是把9007199254740992和9007199254740994的位模式混在一起了吗?谢谢,均匀度是根据52位的数字检查的吗?因为两个数字在未舍入时都是偶数:1000000000000000000000000000000010和1000000000000000000000000000000100顺便说一句,我写了关于二进制分数的舍入。如果你有时间和意愿,我会非常高兴如果你审查它的不一致。谢谢你advance@Maximus根据有效位53的值进行舍入:如果为0,则将其有效截断;如果为1,则将其四舍五入,在第53位为0。顺便说一句,你应该总是用53位来思考,而不是52位加上一个隐藏位——被隐藏是没有意义的。@SimonByrne,你能看看我的。
1 0000000000000000000000000000000000000000000000000010