Javascript:有没有明确的方法来判断两个整数的和是否大于max int?
我正在尝试编写一个测试来检查两个任意整数的和是否大于9007199254740992或小于-9007199254740992。发生这种情况时,js是否始终以可测试的方式运行?根据中指定的JavaScript使用 因此,实际的安全界限是max=Javascript:有没有明确的方法来判断两个整数的和是否大于max int?,javascript,integer,Javascript,Integer,我正在尝试编写一个测试来检查两个任意整数的和是否大于9007199254740992或小于-9007199254740992。发生这种情况时,js是否始终以可测试的方式运行?根据中指定的JavaScript使用 因此,实际的安全界限是max=Math.pow(2,53)-1和min=-(Math.pow(2,53)-1)。它们封装在ECMAScript 6Numberclass常量中: Number.MAX_SAFE_INTEGER; // == 9007199254740991 Number.
Math.pow(2,53)-1
和min=-(Math.pow(2,53)-1)
。它们封装在ECMAScript 6Number
class常量中:
Number.MAX_SAFE_INTEGER; // == 9007199254740991
Number.MIN_SAFE_INTEGER; // == -9007199254740991
考虑到这些限制,这里有一个函数应该能够满足您的要求,以显示在加法下何时可以预期溢出或下溢:
function additionWillOverflow(x,y) {
if( y > 0 ) {
return x > Number.MAX_SAFE_INTEGER - y;
}
return x < Number.MIN_SAFE_INTEGER - y;
}
由于上面提到的浮点表示,从2^53开始,javascript只能表示每秒一个整数。从2^54开始,js只能表示每四分之一个整数,以此类推。这种行为在任何兼容的实现中都应该是一致的(还没有全部测试过),这也是浮点数的工作方式(请检查)
请注意,对任何数值分别调用isNan(x+y)
或isFinite(x+y)
返回false
和true
,即使它们超出了最大安全整数范围(即使在错误的数值结果上调用)
希望这能有所帮助。从以下几点开始并消化:
var x = 9007199254740990;
var y = 3;
console.log( additionWillOverflow(x,y) ); // true
console.log( x + y ); // 9007199254740992(!) - overflow
x = -9007199254740990;
y = -3;
console.log( additionWillOverflow(x,y) ); // true
console.log( x + y ); // -9007199254740992(!) - underflow