JavaScript中所有数字均为64位浮点数,遵循IEEE 754标准。最大正数为1.7976931348623157e+308,最小正数为5e-324。整数精确运算范围为±2^53,超出此范围可能出现精度丢失甚至死循环。位运算仅支持32位整数,大数进行位运算时会截断为32位,导致结果异常。
JavaScript数值类型与范围
在JavaScript中,无论是整数还是浮点数,其数据类型统一为Number。底层实现上,Number类型对应64位浮点数,这与Java中的double类型一致,意味着JS中所有数值本质上都是浮点数。依据IEEE 754浮点数算术标准,JavaScript可表示的数值范围最大值为正负1.7976931348623157乘以10的308次方,最小非零绝对值为正负5乘以10的负324次方。这两个边界值可通过Number对象的MAX_VALUE和MIN_VALUE属性获取。
整数精度与位运算限制
针对整数,依据ECMAScript标准(http://ecma262-5.com/ELS5_HTML.htm#Section_8.5),JavaScript能进行精确算术运算的整数范围是正负2的53次方,即从-9007199254740992到+9007199254740992。超出该范围的整数虽可参与运算,但结果精度无法保证。此外,涉及位运算(如移位操作)时,JavaScript仅支持32位有符号整数,范围限制在-2147483648到+2147483647之间。
数值范围与精度实验
实验
演示如何获取JavaScript中最大数值的绝对值以及最小非零数值的绝对值:
代码如下:
console.log(Number.MAX_VALUE);
console.log(Number.MIN_VALUE);运行上述代码,输出结果分别为1.7976931348623157e+308和5e-324。
当整数超出正负2的53次方范围时,JavaScript无法保证计算结果的精确性:
代码如下:
var a = 9007199254740992;
console.log(a+3);
理论上a+3的正确结果应为9007199254740995,但JavaScript实际输出为9007199254740996。经测试,只要整数大于9007199254740992,此类精度误差便会频繁出现。若仅关注计算偏差,上述情况尚可容忍,但以下示例展示了更严重的后果:
代码如下:
var MAX_INT = 9007199254740992;
for (var i = MAX_INT; i < MAX_INT + 2; ++i) {
// infinite loop
}
由于精度问题,上述for循环条件判断失效,导致程序陷入死循环。
关于位运算,JavaScript仅支持32位整数:
代码如下:
var smallInt = 256;
var bigInt = 2200000000;
console.log(smallInt / 2);
console.log(smallInt >> 1);
console.log(bigInt / 2);
console.log(bigInt >> 1);
观察输出可知,对于32位范围内的整数(如256),位运算(>> 1)结果与除法(/ 2)一致,均为128。然而,对于超过32位范围的整数(如2200000000),除法运算结果正确(1100000000),但位运算结果却严重偏离,输出为-1047483648。这是因为大数在位运算时被截断为32位有符号整数,导致符号位参与运算,产生负值。