JavaScript Number类型详解:表示法、精度与转换
本文深入解析JavaScript中Number类型的内部机制,涵盖IEEE 754存储格式、二进制至十六进制的表示法、浮点数精度陷阱及科学计数法规则。同时详细阐述Infinity与NaN的特殊数值处理,并对比Number、parseInt与parseFloat在类型转换中的具体行为与边界情况,帮助开发者避免常见数值计算错误。
JavaScript Number类型概述
概述
JavaScript内部遵循IEEE 754标准存储数字,不区分整数与浮点数,统一以64位浮点格式保存。这意味着底层存储中不存在纯粹的整数概念。但在特定运算场景下,引擎会将64位浮点数临时转换为32位整数以执行计算。
整数的四种表示法
整数表示
JavaScript支持四种整数字面量表示方式:
1、二进制:以0b或0B为前缀,仅允许包含0和1,出现其他字符将触发报错。
2、八进制:以0o或0O为前缀,或旧式写法中0后接0-7的数字。若数值超出八进制范围,引擎会忽略前导0,将其视为十进制数处理。
注意:在严格模式下,八进制字面量是非法的,会导致引擎抛出语法错误。
3、十六进制:以0x或0X为前缀,后接0-9及A-F(大小写不限)的数字。超出范围字符会引发报错。
4、十进制:常规数字表示法。
var num2 = 0b11;
console.log(num2); //3
var num2 = 0b12;
console.log(num2); //报错
var num8 = 0o76;
console.log(num8); //02
var num8 = 0o78;
console.log(num8); //报错
var num16 = 0x2a;
console.log(num16); //42
var num16 = 0x2h;
console.log(num16) //报错
浮点数与科学计数法
浮点数表示
浮点数必须包含小数点,且小数点后至少有一位数字。与整数不同,浮点数仅支持十进制表示法。
浮点数的精度远低于整数,因此在涉及浮点数的运算与比较时需谨慎处理,避免精度丢失导致的错误。
例如:
console.log(0.1 + 0.2 == 0.3); //false 0.30000000000000004
console.log(0.6/0.2); //2.9999999999999996
科学计数法
对于极大或极小的数值,可以使用e表示法(科学计数法)。该表示法的数值等于e前面的数字乘以10的指数次幂。
JavaScript会在以下两种情况下自动将数值转换为科学计数法,其余情况均保留字面量形式:
1、小数点前的数字位数超过21位。
console.log(1234567890123456789012);// 1.2345678901234568e+21
console.log(123456789012365648787); //123456789012365660000
2、小数点后连续0的个数超过5位。
console.log(0.0000006);//6e-7
console.log(0.000006); //0.000006
数值范围与溢出处理
数值范围
受内存限制,ECMAScript无法存储所有可能的数值,因此定义了最大值与最小值。
最小值存储在Number.MIN_VALUE中,其值为5e-324。
最大值存储在Number.MAX_VALUE中,其值为1.7976931348623157e+308。
console.log(Number.MIN_VALUE) //5e-324
console.log(Number.MAX_VALUE); //1.7976931348623157e+308
若数值超过最大值,JavaScript返回Infinity,称为正向溢出(overflow);若数值等于或小于最小负值-1023(即极度接近0),JavaScript会将其转换为0,称为负向溢出(underflow)。
可使用isFinite()函数判断数值是否有穷。当参数位于最小值与最大值之间时,该函数返回true。
var result = Number.MAX_VALUE + Number.MAX_VALUE;
console.log(isFinite(result)); //false
特殊数值:零、无穷与NaN
特殊数值
1、+0与-0
在大多数比较操作中,这两个零是等价的。
-0 === +0; //true
0 === -0; //true
0 === +0; //true
但在作为分母参与除法运算时,它们的结果不同。
1/-0 == 1/+0; //false
2、Infinity
Infinity表示“无穷”,用于两种场景:一是正数值过大或负数值过小无法表示;二是非零数值除以0的结果。
Math.pow(2,Math.pow(2,100));//Infinity
1/0;//Infinity
参与Infinity的运算结果只能是Infinity本身、0或NaN。
* Infinity;//Infinity
- Infinity;//-Infinity
+ Infinity;//Infinity
/ Infinity;//0
Infinity / 2;//Infinity
Infinity * Infinity;//Infinity
Infinity - Infinity;//NaN
Infinity + Infinity;//Infinity
Infinity / Infinity;//NaN
3、NaN
NaN表示原本应返回数值的操作未返回数值的情况。
NaN与任何值都不相等,包括其自身。涉及NaN的任何运算结果均为NaN。
5 - 'x'; //NaN
Math.acos(2); //NaN
0 / 0; //NaN
NaN == NaN;//false
NaN == Infinity;//false
NaN并非独立数据类型,而是一种特殊数值,其类型仍属于Number。
typeof NaN; //number
isNaN()方法可用于判断值是否为NaN,但该函数仅对数值有效。若传入其他类型,会先尝试转换为数值。例如传入字符串时,字符串会被转换为NaN,导致返回true。因此,isNaN为true的值可能并非NaN,而是无法转换的字符串。
isNaN('Hello') // true
// 相当于
isNaN(Number('Hello')) // true
更可靠的NaN判断方法是利用NaN是唯一不等于自身的值这一特性进行判断。
function isNaN(value){
return value != value;
}
类型转换函数详解
数制转换
有三个函数可将非数值转换为数值:Number()、parseInt()和parseFloat()。Number()可将任意类型值转为数值,而parseInt()和parseFloat()仅适用于字符串到数字的转换。
Number()
转换规则如下:
1、布尔值:true转换为1,false转换为0。
2、null值:返回0。
3、undefined:返回NaN。
4、字符串:遵循以下规则:
(1)若字符串仅包含十进制或十六进制数字,则转换为对应的十进制数值。
注意:Number()不识别八进制数字字符串,会按十进制处理。
字符串'1.2.'不会报错,但数字1.2.会报错。
(2)若字符串为空或仅含空格,则转换为0。
(3)其他情况的字符串,转换为NaN。
Number(true) //1
Number(null) //0
Number(undefined) //NaN
Number("0123") //123
Number("0x123") //291
Number("0.2") //0.2
Number("") //0
Number("asd") //NaN
parseInt()
parseInt()专门用于将字符串转换为整数。转换时会忽略前导空格,直到找到第一个非空格字符。若首个字符非数字或负号,返回NaN;若是,则继续解析直至遇到非数字字符或字符串末尾。
console.log(parseInt(' 123.8px'));//123
console.log(parseInt(' 123.8 '));//123
console.log(parseInt(' -123.8px'));//-123
console.log(parseInt('a123.8px'));//NaN
console.log(parseInt('0 123.8px'));//0
注意:在ECMAScript 5中,parseInt()已失去解析八进制的能力。例如八进制“070”,会忽略前导0,返回十进制的70。
为避免上述困惑,可为parseInt()提供第二个参数:指定转换时使用的基数(进制数)。
parseInt("070") //70
parseInt("070",8) //56
parseFloat()
parseFloat()专门用于将字符串转换为浮点数。解析时同样忽略前导空格,直到找到第一个非空格字符,并持续解析至字符串末尾或遇到无效浮点字符。
console.log(parseFloat(' 0123.px'));//123
console.log(parseFloat(' 123.px'));//123
console.log(parseFloat(' 123.1px'));//123.1
console.log(parseFloat(' 123.1.2px '));//123.1
console.log(parseFloat(' -123.0px'));//-123
console.log(parseFloat('.123.1px'));//0.123
console.log(parseFloat('0 123px'));//0
注意:parseFloat()仅解析十进制,因此十六进制字符串始终转换为0。该函数没有第二个参数用于指定基数。
parseFloat("0xA") //0
注意:Number('')的结果是0,而parseInt('')和parseFloat('')的结果是NaN。
以上内容涵盖了JavaScript Number类型的核心知识,希望对您的学习或工作有所帮助。
免登录快速分享代码:适合面试协作的轻量级JS在线运行工具推荐
2026-11-05 14:45:59
JS空字符串和纯空格转浮点数的结果是什么
2026-11-05 11:04:42
JS在线格式化缩进混乱怎么办?配置项调整技巧
2026-11-04 23:27:25
JS怎么获取秒级时间戳
2026-11-03 21:45:29
JS时间戳怎么从毫秒转换为秒
2026-11-03 20:04:14
