以前知道就知道 js 的小数计算就存在精度问题,比如说 0.1+0.2 != 0.3,出现的原因就是底层的十进制和二进制的转换问题,然后也看到一些解决方法,然后在网上看到一些解决办法

Math.formatFloat = function(f, digit) { 
    var m = Math.pow(10, digit); 
    return parseInt(f * m, 10) / m; 
} 
var A = 0.1; 
var B = 0.2;
console.log(Math.formatFloat(A + B, 1) === 0.3);

上面的解决办法的确解决了 0.1 + 0.2 的问题,因为 0.1 + 0.2 = 0.300xxx4。
但是如果是 15.122222222 + 15.111111111 呢,那么就出现问题了,他俩相加等于 30.233333332999997 这里已经把最后一个 3 转换为 2999997 了。
那么再用上述的方法就出错了,所以在自己写了一个改进的方法其中包括加减乘除运算

Math.formatFloat = function (n, m, rule) {
    let digit
    if (n > m) {
        for (let i = 1; i < 20; i++) {
            if (m * Math.pow(10, i) == parseInt(m * Math.pow(10, i))) {
                digit = i
                break
            }
        }
    } else {
        for (let i = 1; i < 20; i++) {
            if (n * Math.pow(10, i) == parseInt(n * Math.pow(10, i))) {
                digit = i
                break
            }
        }
    }
    const multiple = Math.pow(10, digit)
    switch (rule) {
        case '+':
            return parseInt((n * multiple + m * multiple), 10) / multiple
            break
        case '-':
            return parseInt((n * multiple - m * multiple), 10) / multiple
            break
        case '*':
            return parseInt((n * multiple * m * multiple), 10) / multiple / multiple
            break
        case '/':
            return parseInt((n * multiple / m * multiple), 10) / multiple / multiple
            break
        default:
            return '未知算法'
    }
}

然后经过测试发现是可行的,还实验了一些小数测试,发现是可行的,但是有的情况是没测试到的,如果有其他的错误请指出让我改正。。。


因为是下雨天
3 声望0 粉丝