JavaScript中的小数计算

我们知道在javascript中小数运算是会出现错误的,例如:

1
console.log(0.1 + 0.2);

的计算结果并不是0.3,而是0.30000000000000004

这就很奇怪了,先从javascript中的number类型说起吧。

javascriptnumber类型就是是浮点数,而在javascript中浮点数是IEEE-754 格式规定的,也就是通过二进制数表示的。用二进制书可以准确的表示1/21/41/8这类的小数,而表示0.1这样的小数就会出现问题。
使用二进制表示0.1会被表示成0.0001 1001 1001 1001…,其中1001会无限循环。
使用二进制表示0.2会被表示成0.0011 0011 0011 0011…,其中0011会无限循环。
javascript中双精度浮点数的小数部分最多支持 52 位,并且计算会先将数字转换成二进制计算出结果,再转换成十进制数。
所以0.10.2两者相加之后得到0.0100110011001100110011001100110011001100...因浮点数小数位的限制而截断的二进制数字,这时候,再把它转换为十进制,就成了 0.30000000000000004

解决方法:将小数转换成整型数再计算,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function add(num1, num2) {
let temp1, temp2, multiple;
//分别获取两个小数的小数长度
temp1 = (num1.toString()).split('.')[1].length;
temp2 = (num2.toString()).split('.')[1].length;
//通过比较两个数字的小数位获取大的,计算出需要扩大的倍数
multiple = Math.pow(10, Math.max(temp1, temp1));
//计算结果
return (num1 * multiple + num2 * multiple) / multiple;
}
console.log(add(0.1, 0.2)) //0.3

其余的减法和乘除也是一样。