在JavaScript中,数字的表示是 2^53 - 1 。
2^53 - 1
的 然而 强> , Bitwise operation 计算 32 bits ( 4 bytes ) ,这意味着如果你超过32位,你将开始失去位。
Bitwise operation
32 bits ( 4 bytes )
当数量大于2时,功率53即。
Math.pow(2, 53)
javascript知道它是一个大整数。然后javascript将它们存储为'bigint',以便比较 'bigint'==='bigint' 变得真实。
'bigint'==='bigint'
将数值存储在Math对象本身的更安全的方法。
const bigInt1 = Math.pow(2, 55) const bigInt2 = Math.pow(2, 66) console.log(bigInt1 === bigInt2) // false
吉米的回答 正确表示连续的JavaScript整数谱 的 -9007199254740992 强> 至 的 9007199254740992 强> 包容性(对不起9007199254740993,你可能认为你是9007199254740993,但你错了! 下面或中的演示 的jsfiddle )。
document.write(9007199254740993);
然而,没有任何答案能够以编程方式找到/证明这一点(除了CoolAJ86提到的那个) 他的回答 这将在28。56年完成;),所以这里有一个更有效的方法(确切地说,它更有效率约28.559999999968312年:),以及一个 测试小提琴 :
/** * 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);
该 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 而不是作为一个财产 数 你创建的对象。
该 MAX_SAFE_INTEGER 常数的值为 9007199254740991 (9,007,199,254,740,991或~9千万亿)。这个数字背后的原因是JavaScript使用 双精度浮点格式数 如...中所述 IEEE 754 并且只能安全地表示之间的数字 -(253 - 1) 和 253 - 1 。
MAX_SAFE_INTEGER
9007199254740991
-(253 - 1)
253 - 1
在这种情况下,安全是指能够准确表示整数并正确比较它们的能力。例如, Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2 将评估为true,这在数学上是不正确的。看到 Number.isSafeInteger() 欲获得更多信息。
Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2
因为 MAX_SAFE_INTEGER 是一个静态属性 数 ,你总是把它用作 Number.MAX_SAFE_INTEGER 而不是作为一个财产 数 你创建的对象。
Number.MAX_SAFE_INTEGER
它是2 53 == 9 007 199 254 740 992.这是因为 Number s作为浮点存储在52位尾数中。
Number
最小值为-2 53 。
这会让一些有趣的事情发生
Math.pow(2, 53) == Math.pow(2, 53) + 1 >> true
而且也可能很危险:)
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 }
<子> 进一步阅读: http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html 子>
在Google Chrome内置的javascript中,您可以在数字被称为无限之前转到大约2 ^ 1024。
Scato wrotes:
您想要用于按位操作的任何内容必须介于两者之间 0x80000000(-2147483648或-2 ^ 31)和0x7fffffff(2147483647或2 ^ 31 - 1)。 控制台会告诉你0x80000000等于+2147483648,但是 0x80000000&amp; 0x80000000等于-2147483648
您想要用于按位操作的任何内容必须介于两者之间 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也是。
在撰写本文时,JavaScript正在接收新的数据类型: BigInt 。这是TC39提案 第3阶段 。 BigInt 已经在Chrome中发布,并且正在Node,Firefox和Safari中进行...它引入了带有“n”后缀的数字文字并允许任意精度:
BigInt
var a = 123456789012345678901012345678901n;
当然,当这样的数字(可能是无意地)被强制转换为数字数据类型时,精度仍然会丢失。
Firefox 3似乎没有大数字的问题。
1e + 200 * 1e + 100将精确计算为1e + 300。
Safari似乎也没有任何问题。 (对于记录,如果其他人决定对此进行测试,这是在Mac上。)
除非我在一天的这个时候失去了大脑,否则这比64位整数大。
简短的回答是“这取决于”。
如果您在任何地方使用按位运算符(或者如果您指的是数组的长度),则范围为:
无符号: 0…(-1>>>0)
0…(-1>>>0)
签: (-(-1>>>1)-1)…(-1>>>1)
(-(-1>>>1)-1)…(-1>>>1)
(碰巧的是,按位运算符和数组的最大长度限制为32位整数。)
如果您不使用按位运算符或使用数组长度:
签: (-Math.pow(2,53))…(+Math.pow(2,53))
(-Math.pow(2,53))…(+Math.pow(2,53))
这些限制是由“数字”类型的内部表示强加的,它通常对应于IEEE 754双精度浮点表示。 (注意,与典型的有符号整数不同,由于内部表示的特征,负极限的大小与正极限的大小相同,实际上包括 负 0!)
ECMAScript 6:
Number.MAX_SAFE_INTEGER = Math.pow(2, 53)-1; Number.MIN_SAFE_INTEGER = -Number.MAX_SAFE_INTEGER;
基本上javascript不支持很长时间。 所以对于它可以表示小于32位的正常值,它将使用int类型容器。对于大于32位的整数值,它使用double。在双重复位中,整数部分为53位,其余为尾数(以保持浮点信息)。 所以你可以使用 2^53 - 1 哪个值是 9007199254740991 您可以访问代码中使用的值 Number.MAX_SAFE_INTEGER
我这样写:
var max_int = 0x20000000000000; var min_int = -0x20000000000000; (max_int + 1) === 0x20000000000000; //true (max_int - 1) < 0x20000000000000; //true
对于int32也是如此
var max_int32 = 0x80000000; var min_int32 = -0x80000000;