Skip to main content

数字 Number

Number 类型有几个特殊值,包括 NaN、+Infinity、-Infinity、-0。

NaN

NaN 是一个数值类型的值,表示 not a number,但它不等于任何数值,包括它自己。

console.log("hello" / 5); // 输出:NaN
console.log(NaN == NaN); // 输出:false

isNaN 可以检测当前值是否是非有效数字。

检测机制:Number 类型直接判断;非 Number 类型的基本类型,使用 Number() 转换后判断;非 Number 类型的对象类型,使用 toString() 后再使用 Number() 转换后判断。

console.log(isNaN(NaN)); // 输出:true
console.log(isNaN(1)); // 输出:false

任何数与NaN进行运算都会返回 NaN,除了一个例外。

console.log(NaN+1); // 输出:NaN
console.log(NaN**0); // 输出:1

转换方法

要将一个值转化成 Number 类型,可以使用3种方法

  • Number():出现任意非有效数字,返回 NaN
  • parseInt():将字符串转换为整数类型,从字符串的左侧开始解析,直到遇到非数字字符为止,如果无法解析任何数字,则返回 NaN。可以通过第二个参数来指定解析的进制
  • parseFloat():将字符串转换为浮点数类型,其余同 parseInt 相同

Number() 转换的特例

console.log(Number("")); // 输出:0
console.log(Number("\n")); // 输出:0
console.log(Number(true)); // 输出:1
console.log(Number(false)); // 输出:0
console.log(Number(null)); // 输出:0
console.log(Number(undefined)); // 输出:NaN

浮点数计算问题

浮点数在计算中会引起舍入误差,这是由于计算机内部使用二进制表示浮点数,而某些十进制小数无法精确表示为有限的二进制小数。

0.1 + 0.2 // 输出:0.30000000000000004
0.1 - 0.01 // 输出:0.09000000000000001
1.1 * 100 // 输出:110.00000000000001
0.11 / 0.1 // 输出:1.0999999999999999
0.145.toFixed(2) // 输出:'0.14'
1.345.toPrecision(3) // 输出:'1.34'
Math.round(-0.5) // 输出:-0