【问题标题】:javascript Number constructor strange behaviour [duplicate]javascript Number构造函数奇怪的行为[重复]
【发布时间】:2013-05-05 03:20:31
【问题描述】:

将字符串转换为数字会产生递增值:

var n = '9999999999999999';
console.log(n); // -> 9999999999999999
var nn = Number(n)
console.log(nn); // -> 10000000000000000

如何避免这种情况?

【问题讨论】:

  • 如何避免什么?我想,任意精度是 IEEE754 的一部分。
  • @raina77ow 如何避免这种行为?我应该怎么做才能获得值为 99999999999999999 的 Number 对象?或者也许如何检查数字是否会增加?如果我将n 更改为'999' Number 值是999
  • @PrasathK 我不能。我从 HTML 页面的输入中获取这个值。
  • 您无法获得值为 9999999999999999 的 JS 编号 - 出于同样的原因,您无法在单个字节中存储超过 256 个不同的值。解决此问题的一种可能方法是使用实​​现 BigInteger 数学的现成库 - 例如 jsbn.js

标签: javascript string numbers type-conversion


【解决方案1】:

9999999999999999 在 JavaScript 内部被视为浮点数。它无法以IEEE 754 双精度精确表示,因为它需要 54 位精度(位数为 log2(9999999999999999) = 53.150849512,由于不存在小数位,因此结果必须向上取整),而 IEEE 754 仅提供53 位(1 隐含位 + 52 显式存储的尾数位) - 少一位。因此,数字只是四舍五入。

由于在这种情况下只丢失了一位,即使是 54 位的数字也可以精确表示,因为它们仍然包含 0,这会丢失。考虑到 IEEE 754 的默认无偏舍入模式,奇数 54 位数字被舍入到恰好是 53 位偶数的两倍的最接近的值。

[Source]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2015-10-24
    相关资源
    最近更新 更多