【问题标题】:Javascript max intJavascript 最大整数
【发布时间】:2014-04-03 13:01:39
【问题描述】:

我认为 javascript 的最大整数值是 2^53,但是当我执行以下操作时:

 parseInt(Math.pow(2, 53)) + 10

我正确地得到了 9007199254741002

 (= 9007199254740992 + 10)

这是为什么呢?只有当数字大于或等于允许的最大整数时,我才想使用 bigint.js 库。

【问题讨论】:

标签: javascript biginteger bigint


【解决方案1】:

9007199254740992 是在您开始遇到精度损失问题之前 JavaScript 中的最大整数值。考虑以下几点:

> Math.pow(2, 53) + 1
9007199254740992
> Math.pow(2, 53) + 2
9007199254740994
> Math.pow(2, 53) + 3
9007199254740996
> Math.pow(2, 53) + 4

可以看出,结果值并非在所有情况下都是准确的。这是浮点数的限制,因为只有 53 位专用于系数。一旦超过了可以用 53 位加一个符号位表示的范围,浮点表示将随着值的上升而越来越多地命中或未命中。

【讨论】:

    【解决方案2】:

    JavaScript 使用 IEEE-754 double-precision 数字,其大约具有 15 位小数精度,但范围巨大。在这种格式中,从-2^532^53整数 数字都可以可靠地表示(这是格式的有效位 的精度)。在这些限制之外,可以表示一些整数,但不能表示其他整数。例如,在该范围之外,存在整数间隙。

    例如,双精度数可以表示9,007,199,254,740,9922^53)和9,007,199,254,740,9942^53 + 2),但不能表示9,007,199,254,740,9932^53 + 1):

    控制台会话示例:

    > 9007199254740992 9007199254740992 > 9007199254740992 + 1 9007199254740992 > 9007199254740992 + 2 9007199254740994

    注意其中的第二个。这不是错字。

    【讨论】:

    • 您应该提到,所有不超过 2^53 的整数都在 JavaScript 中精确表示。只有在该值之后,整数的精度才会下降。
    • 有趣.. 所以我想我只是检查整数是否小于 9007199254740992,然后我使用内部数学(如果我只做除法/减法和 %)。如果它高于那个数字,那么我使用 bigint.js 库?
    • @Wesley:是的,我相信 2^53 是最大 safe 值。
    • @Wesley:关键是浮点。如果您坚持使用整数,并且您的任何计算都不会产生小数(因此,您不是除法,而是加法、减法或乘法),您可以依赖整数结果。但是整数之外的不精确性无处不在。经典的例子是0.1 + 0.2,它产生0.30000000000000004
    • @jmar777:是的。即使Number.MAX_VALUE + 1e+291 等于Number.MAX_VALUE。但是Number.MAX_VALUE + 1e+292Infinity
    猜你喜欢
    • 2018-08-27
    • 2015-10-30
    • 1970-01-01
    • 2018-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    相关资源
    最近更新 更多