JavaScript浮点计算

0.30000000000000004

在前端进行业务的计算时,出现了一点错误:

1
2
3
4
5
6
var a = 0.1 ;
var b = 0.2 ;
console.log(a+b);

// 结果
0.30000000000000004

很奇怪,为什么不直接等于0.3

JavaScript中的数字

数值始终是64位的双精度浮点数,0到51存储数字(片段),52 到 62 存储指数,63 位存储符号。

值(aka Fraction/Mantissa) 指数 符号
52 bits(0 - 51) 11 bits (52 - 62) 1 bit (63)

整数会被精确到15位、小数最大数是17位。

对于小数的二进制

系统是将10进制转为二进制再进行计算,0.1的二进制是0001100110...,后面就一直重复00110.2的二进制是0011..,也是重复0011。两个二进制再相加,再转为十进制就是0.30000000000000004

解决方法

1、 先乘后除,缺点是 相乘的结果已经超过了 MAX_SAFE_INTEGER 会出现错误

1
var x = (0.2 * 10 + 0.1 * 10) / 10;

2、指定精度的四舍五入,小数太多,也不是很理想

1
2
3
4
var a = 0.1 ;
var b = 0.2 ;
var c = a+b ;
console.log(parseFloat(c.toFixed(12)));

3、将浮点数转字符串,再模拟实际计算

bignumber.jsdecimal.js,以及big.js

- the End -
0%