JS数值的特征
- 不区分整数值和浮点数值。
- 所有数值均用浮点数表示。
- 采用IEEE-754标准定义的64位浮点数格式表示。(整数在实际操作时(如数组索引),则是基于32位整数)。
整数直接量
-
16进制:0x……
-
8进制:0o……(在ES6严格模式下,禁止使用八进制)
-
2进制:0b……
0xff:255、 0o12:10、 0b1001:9
浮点数直接量
-
实数写法:由整数部分、小数点和小数部分组成。
如:3.1415926
-
指数记数法:在实数部分后跟字母e或E,再跟正负号,在跟一个整型的指数。
如:5.12e12:5.12×1012;1.44E-8: 1.44×10-8
算术运算
-
运算符:加+、减-、乘*、除/、余%、指数**(指数操作符为es6新增)
-
溢出:
1、当数值运算结果超出了JS能表示的数值上限时:
a)正值结果为 Ifinity;
b)负值则为 -Ifinity。2、基于 Infinity 的运算:
// 当数值运算结果超出了JS能表示的数值上限时,溢出 { var c = 1 / 0; console.log(c); // Infinity } // 基于Infinity的运算结果一般都为 ±Infinity { var c = Infinity * 10; console.log(c); // Infinity } // 任何数除Infinity都为0 { var c = 10 / Infinity; console.log(c); // 0 } // Infinity / Infinity = NaN { var c = Infinity / Infinity; console.log(c); // NaN } // Infinity除以任何数求余都为NaN { var c = Infinity % 10; console.log(c); // NaN } // 任何数除以Infinity求余都为任何数 { var c = 5 % Infinity; console.log(c); // 5 }
-
下溢(underflow):
1、当运算结果无限接近0,并比JavaScript能表示的最小数值还小时发生下溢;
2、JavaScript会返回0,若当一个负数发生下溢时,则返回-0。 -
被0整除
简单的返回 ±Infinity。但 0 / 0 = NaN。
{ var a = -10 / 0; var aa = Infinity / 0; console.log(a,aa); // -Infinity Infinity var b = 0 / 0; console.log(b); // NaN }
二进制浮点数与四舍五入错误
-
实数有无数个,但JavaScript通过浮点数的形式只能表示其中有限个数。
-
当JavaScript使用实数时,常常只是真实值的一个近似表示。
-
IEEE-754浮点数表示法是一种二进制表示法,可以精确地表示分数。
如: 1/2 、1/8 和 1/1024等。
-
但常用的分数都是十进制分数,二进制浮点数并不能精确表示类似0.1这样的简单数值。
1、如: 0.3-0.2 = 0.9999999999999998
2、任何使用二进制浮点数的编程语言中都会有这个问题。
3、建议,尽可能使用大整数进行等比修正以避免该类错误,如:3-2。{ var a = 1/2; console.log(a); // 0.5 } { var a = 0.3 - 0.2; console.log(a); // 0.09999999999999998 } { var a = 3 - 2; console.log(a); // 1 }
数值转换
-
JavaScript提供了3个函数可将非数值转换为数值:
1、 Number( ) —— 无包容性
2、 parseInt( ) —— 包容性(不四舍五入,只保留整数部分)
3、 parseFloat( ) —— 包容性Number(""); // 0 Number(false); // 0 Number(null); // 0 Number(true); // 1 Number(undefined); // NaN Number("12.5a"); // NaN Number("011"); // 11 Number("1.1"); // 1.1 Number("0b1001"); // 9 parseInt(""); // NaN parseInt(false); // NaN parseInt(null); // NaN parseInt(true); // NaN parseInt(undefined); // NaN parseInt("12.5a"); // 12 parseInt("011"); // 11 parseInt("1.1"); // 1 parseInt(22.5); // 22 parseInt("0xA"); // 10 该转换不能转换2进制和8进制 parseInt("A",16); // 10 第一个参数是字符串,第二个参数为指定该字符串的编码 // 该转换不能转换2/8/16进制 parseFloat(""); // NaN parseFloat(false); // NaN parseFloat(null); // NaN parseFloat(true); // NaN parseFloat(undefined); // NaN parseFloat("12.5a"); // 12.5 parseFloat("011"); // 11 parseFloat("1.1"); // 1.1 parseFloat(22.5); // 22.5
各类型转换为数值
- 字符串:若其值为数字格式,则转换为对应数值,否则为NaN
- 布尔值:true转换为1,false转换为0
- undefined:转换为NaN
- null:转换为0
- 其他对象:转换为NaN