在JavaScript中检测数字溢出



javaScript中是否有任何内置函数会通知,在数字数据类型上溢出算术操作?像c#和java一样。

从此站点检查:IssafeInteger

var x = Number.MAX_SAFE_INTEGER + 1;
var y = Number.MAX_SAFE_INTEGER + 2;
    console.log(Number.MAX_SAFE_INTEGER);
    // expected output: 9007199254740991
    console.log(x);
    // expected output: 9007199254740992
    console.log(y);
    // expected output: 9007199254740992
    console.log(x === y);
    // expected output: true
    
function warn(a) {
  if (Number.isSafeInteger(a)) {
    return 'Precision safe.';
  }
  return 'Precision may be lost!';
}
    console.log(warn(Number.MAX_SAFE_INTEGER));
    // expected output: "Precision safe."
    console.log(warn(x));
    // expected output: "Precision may be lost!"
    console.log(warn(y)); 
    // expected output: "Precision may be lost!"

与您所引用的语言不同,如果完成了无效的数学操作,JavaScript不会投掷。相反,它返回特殊的数字值以通知您(对它们进行数学始终会再次导致该特定值,因此您可以在算术链的末尾检查它们):

 NaN // Operation could not be done
 Infinity // Number was too large
 -Infinity // Number was too small

对于所有这三种特殊情况,您可以使用isFinite检查:

 // a = 1000, b = 1000, c = 1 -> Infinity
 // a = -1000, b = 1001, c = 1 -> -Infinity
 const a = 2, b = 51, c = 0; // divide by zero -> NaN
 const result = a ** b / c;
 if(!isFinite(result)) {
   console.log("invalid operation");
 }

还请注意,JavaScript号码是浮点,在(-2 ** 53,2 ** 53)之间具有精确的整数范围,其外部每个整数都将失去准确性。同样适用于永远不准确的任何非整数算术。

最新更新