【问题标题】:How does javascript represent integers greater than Number.MAX_SAFE_INTEGER internally? [duplicate]javascript 如何在内部表示大于 Number.MAX_SAFE_INTEGER 的整数? [复制]
【发布时间】:2019-02-15 15:50:54
【问题描述】:

在 javascript 中,数字在内部表示为双精度浮点数,这意味着有 53 位可用于表示整数值。有一个Number.MAX_SAFE_INTEGER 常量说明了这一点,它等于Math.pow(2, 53) - 1。但是,在 javascript 控制台中,我可以输入 Number.MAX_SAFE_INTEGER + 20,它会输出正确的整数值。

javascript如何在内部表示大于Number.MAX_SAFE_INTEGER的数字?

【问题讨论】:

  • 我不明白,你刚刚回答了你自己的问题?
  • 改用+ 19
  • 我认为这里重要的是SAFE这个词
  • 我知道使用大于Number.MAX_SAFE_INTEGER 的数字是不安全的,所以也许更好的问题是为什么 不安全?是否不安全,因为某些浏览器会强制使用 BigInt 而其他浏览器不会(不一致的实现)?或者因为它会给出不可靠的结果。根据 cmets 和现在发布的答案,似乎是后者。

标签: javascript


【解决方案1】:

基本上浮点数表示为:

 digits * 2 ** movement

digits 有 52 位,movement 有 11 位,两者一起形成一个 64 位数字(有 1 个符号位)。现在整数可以只用movement 表示0,然后digits 包含52 位数字,最多可以容纳2 ** 53 - 1 数字。现在对于更大的数字,你必须使用movement,这基本上意味着你将digits向左或向右移动,因此你会失去准确性。

想象一下数字只需要 8 位

  number     >     digits | movement > result
   // savely represented
  11111111   >  111111111 | 0        > 11111111
  // lost the last 1
  111111111  >  111111111 | 1        > 111111110
   // lost the two last 1s
  1111111111 >  11111111  | 10       > 1111111100

【讨论】:

    猜你喜欢
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-15
    • 2016-12-01
    相关资源
    最近更新 更多