什么是JavaScript的最高整数值,数字可以达到而不会丢失精度?


故人
2025-03-17 01:17:12 (1月前)
  1. 这是由语言定义的吗?是否有定义的最大值?在不同的浏览器中是不同的?

14 条回复
  1. 0# 天线宝宝 | 2019-08-31 10-32



    在JavaScript中,数字的表示是

    2^53 - 1





    然而
    </强>



    Bitwise operation

    计算

    32 bits ( 4 bytes )

    ,这意味着如果你超过32位,你将开始失去位。


  2. 1# 遇见你 | 2019-08-31 10-32



    当数量大于2时,功率53即。




    1. Math.pow(2, 53)

    2. </code>


    javascript知道它是一个大整数。然后javascript将它们存储为’bigint’,以便比较

    ‘bigint’===’bigint’

    变得真实。



    将数值存储在Math对象本身的更安全的方法。




    1. const bigInt1 = Math.pow(2, 55)
      const bigInt2 = Math.pow(2, 66)
      console.log(bigInt1 === bigInt2) // false

    2. </code>

  3. 2# SHOU宅大可爱 | 2019-08-31 10-32




    吉米的回答

    正确表示连续的JavaScript整数谱

    -9007199254740992
    </强>


    9007199254740992
    </强>
    包容性(对不起9007199254740993,你可能认为你是9007199254740993,但你错了!

    1. <EM>
    2. 下面或中的演示
    3. <a href="http://jsfiddle.net/briguy37/LRY3u/" rel="nofollow noreferrer">
    4. 的jsfiddle
    5. </A>
    6. </EM>
    7. )。








    1. document.write(9007199254740993);







    然而,没有任何答案能够以编程方式找到/证明这一点(除了CoolAJ86提到的那个)

    他的回答

    这将在28。56年完成;),所以这里有一个更有效的方法(确切地说,它更有效率约28.559999999968312年:),以及一个

    测试小提琴









    1. /**

        • Checks if adding/subtracting one to/from a number yields the correct result.
          *
        • @param number The number to test
        • @return true if you can add/subtract 1, false otherwise.
          */
          var canAddSubtractOneFromNumber = function(number) {
          var numMinusOne = number - 1;
          var numPlusOne = number + 1;

        • return ((number - numMinusOne) === 1) && ((number - numPlusOne) === -1);
          }

      • //Find the highest number
        var highestNumber = 3; //Start with an integer 1 or higher

      • //Get a number higher than the valid integer range
        while (canAddSubtractOneFromNumber(highestNumber)) {
        highestNumber *= 2;
        }

      • //Find the lowest number you can’t add/subtract 1 from
        var numToSubtract = highestNumber / 4;
        while (numToSubtract >= 1) {
        while (!canAddSubtractOneFromNumber(highestNumber - numToSubtract)) {
        highestNumber = highestNumber - numToSubtract;
        }

      • numToSubtract /= 2;
      • }

      • //And there was much rejoicing. Yay.
        console.log(‘HighestNumber = + highestNumber);






    2. 3# 求赞有赞必回 | 2019-08-31 10-32



      我们来吧

      来源



      描述






      MAX_SAFE_INTEGER

      常数的值为

      9007199254740991

      (9,007,199,254,740,991或~9千万亿)。这个数字背后的原因是JavaScript使用

      双精度浮点格式数

      如…中所述

      IEEE 754

      并且只能安全地表示之间的数字

      -(253 - 1)



      253 - 1




      在这种情况下,安全是指能够准确表示整数并正确比较它们的能力。例如,

      Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2

      将评估为true,这在数学上是不正确的。看到

      Number.isSafeInteger()

      欲获得更多信息。



      因为

      MAX_SAFE_INTEGER

      是一个静态属性



      ,你总是把它用作

      Number.MAX_SAFE_INTEGER

      而不是作为一个财产



      你创建的对象。




      浏览器兼容性







    3. 4# 疯子哥哥 | 2019-08-31 10-32



      它是2

      53

      == 9 007 199 254 740 992.这是因为

      Number

      s作为浮点存储在52位尾数中。



      最小值为-2

      53




      这会让一些有趣的事情发生




      1. Math.pow(2, 53) == Math.pow(2, 53) + 1

      2. true

      3. </code>


      而且也可能很危险:)




      1. var MAX_INT = Math.pow(2, 53); // 9 007 199 254 740 992
        for (var i = MAX_INT; i < MAX_INT + 2; ++i) {
        // infinite loop
        }

      2. </code>


      <子>
      进一步阅读:

      http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html

      </子>


    4. 5# 浮华丶 | 2019-08-31 10-32



      在Google Chrome内置的javascript中,您可以在数字被称为无限之前转到大约2 ^ 1024。


    5. 6# 银环蛇 | 2019-08-31 10-32



      Scato wrotes:




      您想要用于按位操作的任何内容必须介于两者之间
      0x80000000(-2147483648或-2 ^ 31)和0x7fffffff(2147483647或2 ^ 31 -
      1)。



      控制台会告诉你0x80000000等于+2147483648,但是
      0x80000000&amp; 0x80000000等于-2147483648




      十六进制小数是无符号正值,因此0x80000000 = 2147483648 - 这在数学上是正确的。如果你想让它成为有符号值,你必须右移:0x80000000&gt;&gt; 0 = -2147483648。你可以写1&lt;&lt; 31也是。


    6. 7# =_= | 2019-08-31 10-32



      在撰写本文时,JavaScript正在接收新的数据类型:

      BigInt

      。这是TC39提案

      第3阶段



      BigInt

      已经在Chrome中发布,并且正在Node,Firefox和Safari中进行…它引入了带有“n”后缀的数字文字并允许任意精度:




      1. var a = 123456789012345678901012345678901n;

      2. </code>


      当然,当这样的数字(可能是无意地)被强制转换为数字数据类型时,精度仍然会丢失。


    7. 8# 浮华丶 | 2019-08-31 10-32



      Firefox 3似乎没有大数字的问题。



      1e + 200 * 1e + 100将精确计算为1e + 300。



      Safari似乎也没有任何问题。 (对于记录,如果其他人决定对此进行测试,这是在Mac上。)



      除非我在一天的这个时候失去了大脑,否则这比64位整数大。


    8. 9# 啦啦啦拉肚子 | 2019-08-31 10-32



      简短的回答是“这取决于”。



      如果您在任何地方使用按位运算符(或者如果您指的是数组的长度),则范围为:



      无符号:

      0…(-1>>>0)



      签:

      (-(-1>>>1)-1)…(-1>>>1)



      (碰巧的是,按位运算符和数组的最大长度限制为32位整数。)



      如果您不使用按位运算符或使用数组长度:



      签:

      (-Math.pow(2,53))…(+Math.pow(2,53))



      这些限制是由“数字”类型的内部表示强加的,它通常对应于IEEE 754双精度浮点表示。 (注意,与典型的有符号整数不同,由于内部表示的特征,负极限的大小与正极限的大小相同,实际上包括



      0!)


    9. 10# 阿政ღ | 2019-08-31 10-32



      ECMAScript 6:




      1. Number.MAX_SAFE_INTEGER = Math.pow(2, 53)-1;
        Number.MIN_SAFE_INTEGER = -Number.MAX_SAFE_INTEGER;

      2. </code>

    10. 11# ℘ 宋唐 ℒº ѵ ℯ楚厦 | 2019-08-31 10-32



      基本上javascript不支持很长时间。

      所以对于它可以表示小于32位的正常值,它将使用int类型容器。对于大于32位的整数值,它使用double。在双重复位中,整数部分为53位,其余为尾数(以保持浮点信息)。

      所以你可以使用

      2^53 - 1

      哪个值是

      9007199254740991


      您可以访问代码中使用的值

      Number.MAX_SAFE_INTEGER


    11. 12# ikun | 2019-08-31 10-32



      我这样写:




      1. var max_int = 0x20000000000000;
        var min_int = -0x20000000000000;
        (max_int + 1) === 0x20000000000000; //true
        (max_int - 1) < 0x20000000000000; //true

      2. </code>


      对于int32也是如此




      1. var max_int32 = 0x80000000;
        var min_int32 = -0x80000000;

      2. </code>

    登录 后才能参与评论