关于BigDecimal 的不精确计算问题

关于BigDecimal 的不精确计算问题

public static void main(String[] args){



       BigDecimal bg1 = new BigDecimal(100.91);        

       BigDecimal bg2 = new BigDecimal(5);



        BigDecimal bg3 = bg1.multiply(bg2);         

       System.out.println(bg3);



}

 输入结果为 504.549999999999982946974341757595539093017578125

实际结果应为 504.55

现在作了如下函数,可以解决一部分处理,但是测试时,有些case,还是有不精确的时候

比如 0.123 和 5E10相乘 scale设置为10的时候,小数部分并不全为零

 public static int getLongLength(BigDecimal numericalValue){

        String sNumericalValue = numericalValue.toPlainString();

        String[] arrayValues = { "", "" };

        if (!(sNumericalValue.indexOf(".") < 0)) {

            arrayValues = sNumericalValue.split("//.");

        } else {

            arrayValues[0] = sNumericalValue;

        }

        if(arrayValues[0].contains("-")){

            arrayValues[0] = arrayValues[0].replaceAll("-", "");

        }

        int intLength = arrayValues[0].length();

        return intLength;

    }

    

    public static BigDecimal muliply(BigDecimal bg1,BigDecimal bg2,int scale,RoundingMode roundingMode){

        BigDecimal result = bg1.multiply(bg2);

        int intLength = getLongLength(result);

        MathContext context = new MathContext(intLength+scale,roundingMode);

        result = result.round(context);

        return result;

    }

需要特别指出的是 numericalValue.toPlainString(); toPlainString() 不会返回XXEXX的科学技术法的形式

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值