最近使用JavaScript的时候遇到一个奇怪的现象。UI上一个输入数值的控件给定了一个超大的范围,从0 到3.40282347E+38
即340282000000000000000000000000000000000。测试在最大最小值时,输入了340282000000000000000000000000000000001
,即最大值+1,结果没有报错。
调查发现这跟JavaScript本身的语言特性有关。与许多其他编程语言不同,JavaScript 没有定义不同类型的数字,如整数、短整型、长整型、浮点型等。JavaScript 数字始终存储为双精度浮点数。在JavaScript里,所有数字都以 64 位浮点格式存储(IEEE 754 标准)。根据此标准,大整数无法精确表示,并且会被四舍五入。因此在 Javascript 中,340282000000000000000000000000000000000001
等于 34028200000000000000000000000000000000000000
JavaScript 只能安全地表示从 -9007199254740991
到 9007199254740991
(253-1
)的整数。测试测的值 3.40282347E+38
已经超出了此范围。超出范围的值会失去精度。
bigint
是JavaScript与2020年新引入的类型,可以表示任意大的整数,但它无法存储带小数的数值。
1
2
3
4
5
var num1 = BigInt(340282000000000000000000000000000000001n);
var num2 = BigInt(340282000000000000000000000000000000000n);
console.log(num1 > num2)
// true