【问题标题】:Why 9007199254740995 is rounded to 9007199254740996为什么9007199254740995四舍五入为9007199254740996
【发布时间】:2016-10-11 06:02:19
【问题描述】:

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

【问题讨论】:

  • 因为它没有足够的空间来存储最后一位。数字具有 53 位精度。正确表示9007199254740993 需要 54 位。没有最后一点,它是9007199254740992
  • @Thomas,是的,请看我在问题末尾的注释
  • 没有四舍五入,JS 只是用完了空间来写入正确描述该数字所需的位,并且您会得到没有这些位的结果。也许我不明白你的问题,因为如果你明白为什么这个数字不能按原样存储,那么你在问什么?
  • @Thomas,请看我的更新
  • 您没有在问题中混淆 9007199254740992 和 9007199254740994 的位模式吗?

标签: javascript floating-point ieee-754


【解决方案1】:

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

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

在 9007199254740995 的情况下,它正好是两个浮点数的中间:9007199254740994,有效位:

1 0000000000000000000000000000000000000000000000000001

和 9007199254740996,带有效位

1 0000000000000000000000000000000000000000000000000010

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

【讨论】:

  • 谢谢,是否根据 52 位数字检查均匀性?因为两个数字在不四舍五入时都是偶数:100000000000000000000000000000000000000000000000000010100000000000000000000000000000000000000000000000000100
  • 顺便说一句,我写了the article 关于四舍五入的二进制分数。如果您有时间和意愿,如果您检查它是否存在不一致之处,我会非常高兴。提前致谢
  • @Maximus 你根据第53位有效位的值四舍五入:如果为0,则保留(有效截断);如果为 1,则向上取整(这将在第 53 位为您提供 0)。顺便说一句,您应该始终考虑 53 位,而不是 52 加上隐藏位——隐藏没有意义。
  • @SimonByrne,你能看看我的this question
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-02
  • 2014-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多