数字

JavaScript 不区分整数值和浮点数值, 所有数字均用浮点数值表示. 按照 JavaScript 中的数字格式, 能够表示的整数范围从 -253 到 253, 即 -9007199254740922 ~ 9007199254740922.
虽然 JavaScript 不区分整数值和浮点数值, 但它的数字格式可分为整形直接量和浮点直接量, 直接量是一个数字直接出现在编程语言中.

1. 整形直接量
(1) 十进制数: 0, 1, 10000 ... ...
(2) 十六进制数: 以 0x 为前缀, 包含数字 0~9 和字母 a~f(A~F).
(3) 八进制数: ECMAScript 标准不支持八进制直接量, 但 JavaScript 的某些实现可用它. 八进制数以 0 开始, 包含数字 0~7, 如: 0127. var LinearFilter = 1006; this.focus = 10;

2. 浮点直接量
浮点直接量包含小数点: 3.14, -0.03. 当它的位数很高时, 可采用指数计数法来表示.
在小写英文字母e后接整形数字, 表示乘以对应的10次方: 10200057200 = 1.022000572e10 = 1.022000572 × 1010
在大写英文字母E后接负号(-)再接整形数字, 表示除以对应的10次方: 0.00001 = 1.0E-5 = 1.0 × 10-5 sphere.radius = 0.7071067811865476; this.center = new Vector2( 0.5, 0.5 );

3. 二进制浮点数计算十进制数时的出错
var n1 = 2.1, n2 = 0.1; console.log(n1 - n2); // 2 var n3 = 2.1, n4 = 0.01; console.log(n1 - n2); // 2.0900000000000003 运行以上代码, 你可发现第二个运算得到的结果并不是2.09. 为什么会出现这个?源于我们日常中所用的数是十进制数: 100, 10, 1, 0, 1/10, 1/100; 而二进制浮点数则是1024, 64, 8, 2, 0, 1/2, 1/8, 1/1024. 即二进制的数无法完全的匹配所有十进制数. 确切的说, JavaScript 通过浮点数形式表现出来的数为18 437 736 874 454 810 627个. 但是, 实数是无穷的. 所以在使用二进制数来进行 十进制数的运算, 可能会出错.

怎么弥补?我们可以把数改为整数 —— 乘以10次方的最高次幂的整数, 相乘后再相除. 如:
2.1 → 210,
0.01 → 1,
210 - 1 = 209,
再除以100, 即得 2.09. 乘以 10 次方的最高次幂意为: 在所有的浮点数中少数点后位数最多的位数. 程序代码可参照下面: function add(n1, n2){ var decimalCount1 = n1.toString().split(".")[1].length, decimalCount2 = n2.toString().split(".")[1].length, maxCount = Math.max(decimalCount1, decimalCount2); return (n1 * Math.pow(10, maxCount) + n2 * Math.pow(10, maxCount)) / Math.pow(10, maxCount); }

4. 类型转换:
toFixed() 保留多少位小数, 并转为字符串
toExponential() 使用指数记数法将数字转为指数形式的字符串
toPrecision() 保留多少位有效数字, 并转为符合格式的字符串
parseInt() 解析字符串, 并转为对应进制(第二个参数)的整数
parseFloat() 解析字符串, 并转为浮点数