JavaScript数值类型整理之数值类型转换

 2015年04月25日    477     声明


最近工作中总要用到Javascript处理订单金额计算相关的情况,而Javascript并不擅长浮点数计算。在我工作的项目中,数据存储使用了PostgreSQL,后端代码使用Node.js。而Node.js读PostgreSQL的numeric数据类型,读出的是字符串类型,因此要对结果做一些处理,由于涉及金额相关计算,又需要对数值做一些取舍。在此,整理下Javascript的数值类型及相关计算的知识,本篇为:数值类型转换。主要介绍:Number()、parseInt()、parseFloat()函数。


ECMASCript提供了三个数据转换函数,可以把非数值类型数据转换为数据类型:Number()、parseInt()、parseFloat()。Number()可用于任何类型数据转换为数值类型,parseInt()和parseFloat()只能用于把字符串类型转换为数值类型。


Number()函数

Number()函数转换规则如下:

Boolean类型:true被转换为1,flase被转换为0
数值类型:原样输出
null:返回0
undefined:返回NaN
字符串类型:
-空字符串,转换为0
-字符串中只包含数字,会被转换为十进制数值类型。
-包含小数点,会被转换成对应的浮点数
-包含0x,会按十六进制处理,转换为对应的十进制数值
-除以上情况外,合部返回NaN
Object类型:调用对象的valueOf()方法,然后按前面的规则转换。如果转换结果为Nan,则调用toString()方法,再次按前面的规则转换。

Number()函数转换示例如下:

console.log(Number(""));		 	 //0
console.log(Number("a string")); 	 //NaN
console.log(Number("0012"));		 //12
console.log(Number(true));			 //1


parseInt()函数

parseInt()函数在转换字符串会看其是否符合数值模式。它会匹配第一个非空字符,第一个字符符合转换规则(字符或负号),继续匹配第二个,直到找到解析完或遇到一个非数据字符。与Number()函数相比,parserInt()和parseFloat()可以部分匹配,Number()函数需要整体匹配。以下是一些转换示例:

console.log(parseInt("123string")); 	 //123
console.log(parseInt("")); 	 			 //NaN
console.log(parseInt("1.23")); 	 		//1
console.log(parseInt("0x2C")); 	 		//123
console.log(parseInt("073")); 	 		//ECMAScript3时为十进制59,ECMAScript5为十进制73

从上面的示例可以看出, ECMAScript3和ECMAScript5对parseInt()处理字符"0"开头的字符串的机制是不一样的。为使不产生歧义,parerInt()可以第二个参数中指定转换时使用的进制。示例如下:

console.log(parseInt("10", 10)); 	 	//10(按十进制进行转换)
console.log(parseInt("10", 8)); 	 	//8 (按八进制进行转换)
console.log(parseInt("10", 2)); 	 	//2 (按二进制进行转换)
console.log(parseInt("10", 16)); 	 	//16(按十六进制进行转换)
console.log(parseInt("0xA", 16)); 	 	//10
console.log(parseInt("A"));		 	 	//NaN
console.log(parseInt("A", 16)); 	 	//10 指定按十六进制转换时,被转换值可以不加0x


parseFloat()函数

与parseInt()函数类型,parseFloat()也是从第一个字符开始解析每个字符,直到字符串结尾或遇到一个无效的浮点数字字符为止。parseFloat()函数只解析十进制数值,因此没有第二个参数,十六进制会当作0来处理。示例如下:

console.log(parseFloat("0xA")); 	 	//0
console.log(parseFloat("A")); 	 		//NaN 
console.log(parseFloat("123abc")); 	    //123
console.log(parseFloat("12.3")); 	 	//12.3
console.log(parseFloat("12.3.23")); 	//12.3
console.log(parseFloat("12.3e3")); 		//12300