关于BigDecimal 的不精确计算问题

来源:互联网 发布:linux top virt 编辑:程序博客网 时间:2024/05/01 10:02

关于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的科学技术法的形式

 

原创粉丝点击