关于0.1加0.2为什么不等于0.3及解决

340 阅读1分钟

为什么?

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