← 返回博客列表

JS 浮点数运算精度问题

Vic.Wang2015/09/24940 阅读0 喜欢最近更新 2026/07/08 16:46:46

本文写于 2015 年,距今已有 11 年,文中提及的技术方案与接口可能已经过时,请注意甄别参考。

JavaScript里面的浮点数是采用 IEEE754 FP 编码的,采用这种编码的语言都会有问题,比如 C、C++、Java 等都有问题,但是这些语言自身有标准类库来弥补,而 JS 却没有,所以就会掉坑里啦。

比如:

0.1 + 0.2 === 0.30000000000000004

1000000000000000128 === 1000000000000000129

0.7 * 180 === 125.99999999998

是不是很诧异,0.1+0.2居然不等于0.3,没办法,这就是bug。

解决办法就是自己处理浮点数,下面的方法是网上的。

求和运算:

function accAdd(num1, num2) {
    var r1, r2, m;

    try {
        r1 = num1.toString().split('.')[1].length;
    } catch(e) {
        r1 = 0;
    }

    try {
        r2 = num2.toString().split(".")[1].length;
    } catch(e) {
        r2 = 0;
    }

     m = Math.pow(10, Math.max(r1, r2));

    return Math.round(num1 * m + num2 * m) / m;
}

相减运算:

function accSub(num1, num2) {
    var r1, r2, m;

    try {
        r1 = num1.toString().split('.')[1].length;
    } catch(e) {
        r1 = 0;
    }

    try {
        r2 = num2.toString().split(".")[1].length;
    } catch(e) {
        r2 = 0;
    }

    m = Math.pow(10, Math.max(r1, r2));
    n = (r1 >= r2) ? r1 : r2;

    return (Math.round(num1 * m - num2 * m) / m).toFixed(n);
}

相除运算:

function accDiv(num1, num2) {
    var t1, t2, r1, r2;

    try {
        t1 = num1.toString().split('.')[1].length;
    } catch(e) {
        t1 = 0;
    }

    try {
        t2 = num2.toString().split(".")[1].length;
    } catch(e) {
        t2 = 0;
    }

    r1 = Number(num1.toString().replace(".", ""));
    r2 = Number(num2.toString().replace(".", ""));

    return (r1 / r2) * Math.pow(10, t2 - t1);
}

相乘运算:

function accMul(num1, num2) {
    var m = 0,
        s1 = num1.toString(),
        s2 = num2.toString();

    try {
        m += s1.split(".")[1].length;
    } catch(e) {

    };

    try {
        m += s2.split(".")[1].length;
    } catch(e) {

    };

    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
}

想了解更多,看下面链接:

JS魔法堂:彻底理解0.1 + 0.2 === 0.30000000000000004的背后

http://0.30000000000000004.com/

若有共鸣,不妨点个喜欢

本文地址:https://www.mingsixue.com/blog/detail/JS-floating-number-bug

分享:微博QQ空间X