为什么?
console.log(0.1 + 0.2) // 0.30000000000000004
0.1+0.2为什么不等于0.3,首先我们知道在计算机中所有的数据都是以二进制进行存储的,那么就先来计算一下0.1和0.2的二进制分别是什么
// 0.2的二进制
0.2 * 2 = 0.4 0
0.4 * 2 = 0.8 0
0.8 * 2 = 1.6 1
0.6 * 2 = 1.2 1
0.2 * 2 = 0.4 0
0.4 * 2 = 0.8 0
由此得到0.2的二进制为0.001100...会无限循环下去,但是我们的计算机是64bit的,所以0.2在计算中最多只能存储64位,多余的会直接被忽略掉,那么我们就得到了一个不全等于0.2的二进制数,再相加的时候会再将二进制相加之后在转为十进制,所以得出的结论就是在转换的过程中值已经发生改变,所以才会导致数值是与预期不符的,这是由于计算机的设计问题而出现的BUG,那么知道了这个问题就需要思考如何去解决这个问题。
解决
方法1
可以通过toFixed()的方法进行
(0.1+0.2).toFixed(2) // 0.3
但是这样的话计算结果是肯定有小数的,且toFixed()是将数值转换为字符串之后进行截取的,所以返回的结果是一个字符串,我们还需要parseFloat()将这个数转为浮点型。
方法二
扩大系数法,乘以同一个数,然后再同时除以这个数
const coefficient = function coefficient(num){
num = num + ''
let [,char = ''] = num.split('.')
len = char.length
return Math.pow(10,len)
}
const plus = function plus(num1,num2){
// 无论传进来的值是什么都先转换位数字
num1 = + num1
num2 = + num2
// 如果为true说明不是数字直接return
if(isNaN(num1) || isNaN(num2)) return NaN
let max = Math.max(coefficient(num1),coefficient(num2))
return (num1 * max + num2 * max) / max
}
console.log(plus(0.1,0.2)); // 0.3