0.1 +0.2 = 0.3吗 面试题

205 阅读1分钟

0.1+0.2等于0.3吗

不等于

解决:

  • 强制保留小数点后多少位

  • 扩大10倍相加后再缩小10倍。为了将来在项目中避免出现小数不精准的情况,可以自己手动封装计算加、减、乘、除的函数

    封装

    function chu(a, b, signal) {
        // 判断a和b是是否是小数
        // 将a和b转成字符串
        a = '' + a
        b = '' + b
        if(!a.includes('.') && !b.includes('.')) {
            switch(signal) {
                case '/':
                    return +a / +b
                case '*':
                    // 让结果缩小
                    return +a * +b
                case '-':
                    return +a - +b
                case '+':
                    return +a + +b
                default:
                	return NaN
            }
        }
        // 获取a和b中小数点所在下标
        let aIndex = a.indexOf('.')
        let bIndex = b.indexOf('.')
        // 判断a和b中是否包含小数点
        let aSuffix = ''
        if(aIndex >= 0) {
            // 截取a中小数点后的部分
            aSuffix = a.slice(aIndex + 1)
        }
        let bSuffix = ''
        if(bIndex >= 0) {
            bSuffix = b.slice(bIndex + 1)
        }
        // 计算a和b小数点后较长的位数
        let maxSuffix = Math.max(aSuffix.length, bSuffix.length)
        // 将a和b都扩大10的maxSuffix次方
        a = +a * Math.pow(10, maxSuffix + 1)
        b = +b * Math.pow(10, maxSuffix + 1)
        switch(signal) {
            case '/':
                // 让a和b相除
                return a / b
            case '*':
                // 让结果缩小
                return a * b / Math.pow(10, (maxSuffix + 1) * 2)
            case '-':
                return (a - b) / Math.pow(10, (maxSuffix + 1))
            case '+':
                return (a + b) / Math.pow(10, (maxSuffix + 1))
            default:
                return NaN
        }
    }
    // 调用
    var sum = calculate(100, 2, '/')
    console.log(sum)