【问题标题】:When JavaScript maximum number length more than 16,what happen ?当 JavaScript 最大数字长度超过 16 时,会发生什么?
【发布时间】:2018-09-23 15:51:27
【问题描述】:

看这张图。(下划线是输入的。)

为什么 JavaScript Number 的结尾带有尾随零或不可预测的数字?

我用https://www.ecma-international.org/ecma-262/5.1/#sec-9.7检查了文档

但我找不到任何对这个问题有用的东西。

【问题讨论】:

  • 我想你可以在这里找到答案:stackoverflow.com/questions/307179/…
  • 这些数字比Number.MAX_SAFE_INTEGER 大,因此您会遇到问题。
  • 所有 JavaScript 数字都是 IEEE 双精度浮点数。因此,它们的最大精度为 53 位。超过这个精度,你会在整数行中出现间隙。 What every programmer should know about floating point numbers)
  • 我知道为什么会出现问题,我想知道数字末尾是否有规律?
  • 我相信混淆只是关于控制台尝试将数字显示为整数值,即使在值实际存储为浮点数并且精度已经丢失之后。因此,如果您看到“1.1111111111111111e+16”,您就会知道它已转换为浮点数,对吧?

标签: javascript ecmascript-5


【解决方案1】:

Javascript 中的数字使用Double-precision floating-point format,它可以表示 -(2^53 - 1) 和 (2^53 - 1) 中的数字。这将最大安全数 (Number.MAX_SAFE_INTEGER) 限制为 9007199254740991。

因此,以上任何数字都将无法准确表示。

【讨论】:

  • 我的疑惑是到底有没有规律?
【解决方案2】:

所以问题是有一个最大整数可以在 javascript 中安全操作,之后你应该根据实现得到一些意想不到的结果

阅读关于最大安全整数https://www.ecma-international.org/ecma-262/6.0/#sec-number.max_safe_integer

顺便说一句,有一个新的bigint 类型可以处理大量数字https://developers.google.com/web/updates/2018/05/bigint

但是我认为 bigint 还不是标准

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-08
    • 2020-06-12
    • 2011-07-05
    • 1970-01-01
    • 2013-05-15
    • 2018-10-25
    • 2020-06-15
    相关资源
    最近更新 更多