数值
Number类型使用IEEE754格式来表示整数和浮点数值。为了支持各种数值类型,ECMA-262定义了不同的数值字面量格式(八进制、十六进制),但在进行算术计算时,所有数值都将转换成十进制数值。
在程序使用某个值时,会将数字以位序列的方式存放在计算机的内存当中。JavaScript使用固定长度为64位的位序列来存储数字值,因此表示数字的个数是有限的。对于二进制来说,大约是2的64次方,1800亿亿。但在实际中,并不能使用所有少于1800亿亿的数字,因为1800亿亿除了要表达负数,还有浮点数。在JavaScript中实际可存储的数字范围是9000万亿。对于过大或者过小的数字来说,可以使用科学技术法来表示。
浮点数值最高的精度是17位小数,但是在进行算术计算时其精确度远远不如整数。例如,0.1加0.2的结果不是0.3,而是0.30000000000000004。因此永远不要测试某个特定的浮点数值。浮点数值的计算误差属于IEEE754数值浮点计算的通病,ECMAScript并非独此一家,其他使用相同格数式的语言也存在这个问题。
Infinity
由于以上内存的限制,ECMA不能保存所有的数值。ECMA把最小数值保存在Number.MIN_VALUE
中,在大多数浏览器中,这个值是5e-324。最大的数值保存在Number.MAX_VALUE
,在大多数浏览器中值为1.7976931348623157e+308。如果计算超出了这两个范围,就会自动转换成特殊Infinity值,Infinity(正无穷)和 -Infinity(负无穷)。
NaN
NaN,即非数值(Not a Number),是一个特殊的数值,表示一个要奔来返回数值的操作数未返回数值的情况。例如在0/0、Infinity - Infinity 或当数值运算中产生不精确或无意义的结果时,就用NaN来表示。
var num = 99 / 'abc'; // NaN
isNaN
isNaN( ) 函数用来确定一个值是否为不能被转化为有效数字。NaN 与 JavaScript 中其他的值不同,NaN不能通过相等操作符(== 和 ===)来判断 ,因为 NaN == NaN 和 NaN === NaN 都会返回 false。 因此,isNaN 就很有必要了。
isNaN(NaN); // true
isNaN('blue'); // true
isNaN('10'); // false
isNaN(true) // false
数值转换
其他类型转化为数值
Number()
、parseInt()
和parseFloat()
,第一个函数即转型函数Number()
克用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这三个函数对于同样的输入会返回不同的结果。
数据类型 | "" | null | false | true | "hello11.11" | "11.11hello" |
---|---|---|---|---|---|---|
Number | 0 | 0 | 0 | 1 | NaN | NaN |
parseInt | NaN | NaN | NaN | NaN | NaN | 11 |
parseFloat | NaN | NaN | NaN | NaN | NaN | 11.11 |
var num = Number("11.11hello"); //NaN
var int = parseInt("11.11hello"); //11
var float = parseFloat("11.11hello"); //11.11
Number()
函数在转换字符串时比较复杂且不合理,因此处理整数时候常用的是parseInt()
。parseInt()
还能传入第二个参数按X进制解析,而parseFloat()
和Number()
只解析十进制值。
数值转化为字符串 toFixed
toFixed 方法会安装指定的小数位返回数值字符串
var num = 10.0005;
num.toFixed(0); //"10"
num.toFixed(2); //"10.00"
num.toFixed(3); //"10.001"