JavaScript Number类型详解:表示法、精度与转换

作者:键盘侠

时间:2026-10-22

浏览:138

本文深入解析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类型的核心知识,希望对您的学习或工作有所帮助。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章