数字 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()
:出现任意非有效数字,返回 NaNparseInt()
:将字符串转换为整数类型,从字符串的左侧开始解析,直到遇到非数字字符为止,如果无法解析任何数字,则返回 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