Web

JavaScript 大数值的比较

Posted by Kerwen Blog on October 22, 2024

最近使用JavaScript的时候遇到一个奇怪的现象。UI上一个输入数值的控件给定了一个超大的范围,从0 到3.40282347E+38即340282000000000000000000000000000000000。测试在最大最小值时,输入了340282000000000000000000000000000000001,即最大值+1,结果没有报错。

调查发现这跟JavaScript本身的语言特性有关。与许多其他编程语言不同,JavaScript 没有定义不同类型的数字,如整数、短整型、长整型、浮点型等。JavaScript 数字始终存储为双精度浮点数。在JavaScript里,所有数字都以 64 位浮点格式存储(IEEE 754 标准)。根据此标准,大整数无法精确表示,并且会被四舍五入。因此在 Javascript 中,340282000000000000000000000000000000000001 等于 34028200000000000000000000000000000000000000 JavaScript 只能安全地表示从 -90071992547409919007199254740991253-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

Reference

JavaScript BigInt