1, 为什么使用浮点数计算不安全?
在计算机中,数据都是以二进制存储在计算机的内存中,js中的数字是以IEEE754的标准,使用64位双精度浮点型来表示。其中符号位S,指数位E,尾数位M分别占了1,11,52位,并且在ES5规范中指出了指数位E的取值范围是[-1074, 971]。因为精度(precision)有限,所以所有的浮点数都是不安全的。 0.1+0.2 = 0.30000000000000004
2, 解决方案:
- 当要求不是特别精确时(允许有误差),可以使用 四舍五入
- 将小数转换成整数,计算完结果在 *e^-n 缩小回去
- 把小数转换成字符串,将字符串模拟 数字
- && 使用mathjs 解决精度问题
var math = require('mathjs')
function printFn(value) {
const precision = 14
return Number(math.format(value, precision))
}
console.log(printFn(0.1+0.2) == 0.3);
console.log(0.1*0.2);