JS浮点数运算(j简单函数封装)和使用big.js

本文介绍了处理浮点数运算中精度问题的方法,包括自定义函数实现加减乘除运算,使用big.js库进行高精度计算,以及通过调整数值大小和使用toFixed方法来改善精度。此外还提供了一些实用的代码示例。

1、函数封装

 // 浮点数加法运算
    function floatAdd(arg1, arg2) {
        var r1, r2, m;
        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));
        return (arg1 * m + arg2 * m) / m;
    }


    // 浮点数减法运算
    function floatSub(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));
        n = (r1 >= r2) ? r1 : r2;
        return ((arg1 * m - arg2 * m) / m).toFixed(n);
    }

    // 浮点数乘法运算
    function floatMul(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);
    }


    // 浮点数除法运算
    function floatDiv(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) {
        }
        with (Math) {
            r1 = Number(arg1.toString().replace(".", ""));
            r2 = Number(arg2.toString().replace(".", ""));
            return (r1 / r2) * pow(10, t2 - t1);
        }
    }

    // 设置数值精度
    function setScale(value, scale, roundingMode) {
        if (roundingMode.toLowerCase() == "roundhalfup") {
            return (Math.round(value * Math.pow(10, scale)) / Math.pow(10, scale))
                    .toFixed(scale);
        } else if (roundingMode.toLowerCase() == "roundup") {
            return (Math.ceil(value * Math.pow(10, scale)) / Math.pow(10, scale))
                    .toFixed(scale);
        } else {
            return (Math.floor(value * Math.pow(10, scale)) / Math.pow(10, scale))
                    .toFixed(scale);
        }
    }


使用方法:

            setScale(value, scale, roundingMode) //设置精度 参数1、设置的值,2、保留几位小数,3、选择四舍五入还是向上取,或者向下取
            floatAdd(arg1, arg2) //浮点数加法
            floatSub(arg1, arg2) //浮点数减法
            floatMul(arg1, arg2) //浮点数乘法
            floatDiv(arg1, arg2) //浮点数除法

2、使用big.js(https://www.npmjs.com/package/big.js

1、npm install --save big.js

2、import Big from 'big.js'

使用big.js运算的返回的是一个big实例,可链式调用,最终结果,使用toString()方法转为字符串进行页面渲染。

示例:(加减乘除的基本运用)

let  a = new Big(0.2);

let b = new Big(0.1);

a.add(b).toString()    //0.3

a.sub(b).toString()   //0.1

a.mul(b).toString()  //0.02

a.div(b).toString()      //2

3、不使用第三方

    常规方法:如果有2-4位小数点存在,可以先把数据扩大10000倍,求出结果后再缩小10000倍

4、toFIxed(2)精度问题

 

处理方法:

数字+0.005 ,然后直接截取小数点后两位即可。   小数点后第三位如果大于5+5产生进位,小于5,不产生进位。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值