8.88乘以100 存在bug

发布于 8 年前作者 min8118534 次浏览最后编辑 8 年前来自 ask

8.88乘以100 为什么不是等于888呢,是在支付的时候出现的

8 回复
minghu
minghu1 楼6 年前

恩,了解了,记住了一个坑,

houli
houli2 楼6 年前

回复楼上, 用户一般输入单位为元。 服务器为避免浮点数一般单位为分

xiulanding
xiulanding3 楼6 年前

parseInt

yang47
yang474 楼6 年前

这是js浮点精度问题,可以通过引入decimal.js来解决.

比如Decimal(8.88).mul(Decimal(100)).toFixed(2)

kyu
kyu5 楼6 年前

价格难道不是后端接口计算么

怎么会让小程序端去算。。。。

xiulanduan
xiulanduan6 楼6 年前

谢谢大家的提示

heming
heming7 楼6 年前

试试这样处理一下

Math.floor(8.88 * 100 * 100) / 100

dlin
dlin8 楼6 年前

浮点数运算常见问题。 自己重新实现浮点数的 ±*/就行了。 乘法如下

 /**

    ** 加法函数,用来得到精确的浮点数加法结果

    **/

    accAdd: function (arg1, arg2) {

        var r1, r2, m, c;

        try {

            r1 = arg1.toString().split(“.”)[1].length;

        }

        catch (e) {

            r1 = 0;

        }

        try {

            r2 = arg2.toString().split(“.”)[1].length;

        }

        catch (e) {

            r2 = 0;

        }

        c = Math.abs(r1 - r2);

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

        if (c > 0) {

            var cm = Math.pow(10, c);

            if (r1 > r2) {

                arg1 = Number(arg1.toString().replace(“.”, “”));

                arg2 = Number(arg2.toString().replace(“.”, “”)) * cm;

            } else {

                arg1 = Number(arg1.toString().replace(“.”, “”)) * cm;

                arg2 = Number(arg2.toString().replace(“.”, “”));

            }

        } else {

            arg1 = Number(arg1.toString().replace(“.”, “”));

            arg2 = Number(arg2.toString().replace(“.”, “”));

        }

        return (arg1 + arg2) / m;

    },

    /**

    ** 减法函数,用来得到精确的浮点数减法结果

    **/

    accSub: function (arg1, arg2) {

        var r1, r2, m, n;

        try {

            r1 = arg1.toString().split(“.”)[1].length;

        }

        catch (e) {

            r1 = 0;

        }

        try {

            r2 = arg2.toString().split(“.”)[1].length;

        }

        catch (e) {

            r2 = 0;

        }

        m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度

        n = (r1 >= r2) ? r1 : r2;

        return ((arg1 * m - arg2 * m) / m).toFixed(n);

    },

    /**

    ** 乘法函数,用来得到精确的浮点数乘法结果

    **/

    accMul: function (arg1, arg2) {

        var m = 0, s1 = arg1.toString(), s2 = arg2.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);

    },

    /**

    ** 乘法函数,用来得到精确的浮点数除法结果

    **/

    accDiv: function (arg1, arg2) {

        var t1 = 0, t2 = 0, r1, r2;

        try {

            t1 = arg1.toString().split(“.”)[1].length;

        }

        catch (e) {

        }

        try {

            t2 = arg2.toString().split(“.”)[1].length;

        }

        catch (e) {

        }

        r1 = Number(arg1.toString().replace(“.”, “”));

        r2 = Number(arg2.toString().replace(“.”, “”));

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

    },