js中解决两个浮点数相加减的精度问题

在开发中,很多时候都要处理浮点数的相加减运算,所以特地在此记录一下。

问题原因:产生该问题的原因是因为在计算机中,是利用二进制来表示小数,有些小数是用二进制表现不出来的,所以产生了精度问题。

例子:0.1+0.2  按照我们常规思路,他是等于0.3的,但是在计算机中 0.1+0.2 = 0.30000000000000004

解决思路:将浮点数转化为整数,相加减了之后在将结果转化为浮点数。

代码:

  1.   两个浮点数相减返回精确结果:
      // 两个浮点数相减返回精确结果
              function subFloatToInt(minuend,subtraction) {
    
                    var decimalLength,totalValue,minuendLength,subtractionLength;
    
                    try {
                        minuendLength = minuend.toString().split(".")[1].length;
                    }
                    catch (e) {
                        minuendLength = 0;
                    }
                    try {
                        subtractionLength = subtraction.toString().split(".")[1].length;
                    }
                    catch (e) {
                        subtractionLength = 0;
                    }
    
                    decimalLength =  minuendLength >= subtractionLength ? minuendLength : subtractionLength;
    
                    totalValue  =  ((minuend*Math.pow(10,decimalLength) - subtraction*Math.pow(10,decimalLength))/ Math.pow(10,decimalLength)).toFixed(decimalLength);
    
                    return totalValue;
                }

     

  2. 两个浮点数相加返回精确结果:
// 两个浮点数相加返回精确结果
           function accAdd(addendOne, addendTwo) {
                var addendOneLength, addendTwoLength, maxValue, absValue;
                try {
                    addendOneLength = addendOne.toString().split(".")[1].length;
                }
                catch (e) {
                    addendOneLength = 0;
                }
                try {
                    addendTwoLength = addendTwo.toString().split(".")[1].length;
                }
                catch (e) {
                    addendTwoLength = 0;
                }
                // 判断绝对值的结果,
                absValue = Math.abs(addendOneLength - addendTwoLength);
                maxValue = Math.pow(10, Math.max(addendOneLength, addendTwoLength));

                if (absValue > 0) {
                    var power = Math.pow(10, absValue);
                    if (addendOneLength > addendTwoLength) {
                        addendOne = Number(addendOne.toString().replace(".", ""));
                        addendTwo = Number(addendTwo.toString().replace(".", "")) * power;
                    } else {
                        addendOne = Number(addendOne.toString().replace(".", "")) * power;
                        addendTwo = Number(addendTwo.toString().replace(".", ""));
                    }
                } else {
                    addendOne = Number(addendOne.toString().replace(".", ""));
                    addendTwo = Number(addendTwo.toString().replace(".", ""));
                }
                return (addendOne + addendTwo) / maxValue;
            }

  

按照上述思路,我们在后台编写代码的时候也能够对浮点数进行处理,但是推荐用 BigDecimal

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值