数值

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()克用于任何数据类型,而另两个函数则专门用于把字符串转换成数值。这三个函数对于同样的输入会返回不同的结果。

数据类型""nullfalsetrue"hello11.11""11.11hello"
Number0001NaNNaN
parseIntNaNNaNNaNNaNNaN11
parseFloatNaNNaNNaNNaNNaN11.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"

参考