理解JavaScript的浮点数

理解JavaScript的浮点数

大多数编程语言都有多种数据类型,但是Javascript 却只有一种。使用 typeof 运算符查看无论是 ,整数还是浮点数JavaScript都简单的返回一个结果

1
2
3
typeof 17; // number
typeof 98.6; // number
typeof -2.1; // number

事实上JavaScript中所有的数字都是双精度浮点数。

这是由IEEE 745标准定制的64位编码数字 —即 “doubles”; JavaScript使用双精度浮点数来完美的表达高到53位精度的整数,-2^53次方到2^53次方的所有整数都是有效的双精度浮点数。因此尽管JavaScript中缺少明显的整数类型,但是完全可以进行整数运算。

位运算比较特殊JavaScript不会直接将操作数作为浮点数进行运算,而是会将其隐式的转换为32位整数后进行运算。以按位或为例:

1
2
3
4
5
6
7
8
8 | 1

00000000000000000000000000001000

00000000000000000000000000000001

00000000000000000000000000001001

将8 和1分别转为32位的二进制序列然后进行运算, 所有的位运算符的工作方式是相同的。他们先将操作数转换为整数,然后使用整数位模式进行运算,最后将结果转换为标准的JavaScript浮点数。

浮点数的运算需要时刻保持警惕,因为它们出了名的不精确,甚至一些看起来最简单的算术运算都会产生不正确的结果

1
2
3
4
5
6
7
0.1 + 0.2;  // 0.30000000000000004
// 实数满足结合律 即实数 x, y, z 总是满足 (x + y) + z = x + (y + z); 但是对于浮点数来说却不总是这样

(0.1 + 0.2) + 0.3 // 0.6000000000000001

0.1 + (0.2 + 0.3) // 0.6

浮点数权衡了精度和性能。当我们关心精度时,要小心浮点数的局限性。一个有效的解决方法是尽可能采用整数值运算,因为整数在表示时不需要舍入。只需要担心范围符合 -2^53 到 2^53的整数


Effective JavaScript (二)
http://example.com/2018/06/21/read-book-effective-two/
作者
toshiba
发布于
2018年6月21日
许可协议