浮点数计算精度问题
2022-04-13 本文已影响0人
maomizone
产生的原因
计算机在进行运算时是将数值转为二进制后计算,我们可以通过num.toString(2)这个方法查看转为二进制的字符串,当数字是浮点数时,转换为二进制时可能是循环数,而计算机存储只保留64位,所以对于循环数来说必然要舍弃位数,出现精度的问题
let a = 10
console.log(a.toString(2)); // 1010
a = 0.1 // 循环数
console.log(a.toString(2)); // 0.0001100110011001100110011001100110011001100110011001101
a = 0.5
console.log(a.toString(2)) // 0.1
解决方案
- toFixed(length):保留length位数,四舍五入
function add(num1, num2){
return (num1 + num2).toFixed(2)
}
console.log(add(0.1, 0.2)); // 0.30000000000000004 -> 0.30
- 扩大系数法,就是将浮点数都变成整数后计算,最后再除以系数
function plus(num1, num2){
// 先转换一下 '1'->1
num1 = +num1
num2 = +num2
if(isNaN(num1) || isNaN(num2)){
return NaN
}
let max = Math.max(getPow(num1), getPow(num2))
return (num1*max + num2*max)/max
}
function getPow(num){
// 解构赋值
let [, char = ''] = (num + '').split('.')
let len = char.length
return Math.pow(10, len)
}
console.log(plus(0.1, 0.234)); // 0.334