关于BigDecimal 的不精确计算问题 view plaincopy to clipboardprint? public static void main(String[] args){ BigDecimal bg = new BigDecimal(); BigDecimal bg = new BigDecimal(); BigDecimal bg = bgmultiply(bg); Systemoutprintln(bg); } public static void main(String[] args){ BigDecimal bg = new BigDecimal(); BigDecimal bg = new BigDecimal(); BigDecimal bg = bgmultiply(bg); Systemoutprintln(bg); } 输入结果为 实际结果应为 现在作了如下函数可以解决一部分处理但是测试时有些case还是有不精确的时候 比如 和 E相乘 scale设置为的时候小数部分并不全为零 public static int getLongLength(BigDecimal numericalValue){ String sNumericalValue = numericalValuetoPlainString(); String[] arrayValues = { }; if (!(sNumericalValueindexOf() < )) { arrayValues = sNumericalValuesplit(\\); } else { arrayValues[] = sNumericalValue; } if(arrayValues[ntains()){ arrayValues[] = arrayValues[]replaceAll( ); } int intLength = arrayValues[]length(); return intLength; } public static BigDecimal muliply(BigDecimal bgBigDecimal bgint scaleRoundingMode roundingMode){ BigDecimal result = bgmultiply(bg); int intLength = getLongLength(result); MathContext context = new MathContext(intLength+scaleroundingMode); result = resultround(context); return result; } public static int getLongLength(BigDecimal numericalValue){ String sNumericalValue = numericalValuetoPlainString(); String[] arrayValues = { }; if (!(sNumericalValueindexOf() < )) { arrayValues = sNumericalValuesplit(\\); } else { arrayValues[] = sNumericalValue; } if(arrayValues[ntains()){ arrayValues[] = arrayValues[]replaceAll( ); } int intLength = arrayValues[]length(); return intLength; } public static BigDecimal muliply(BigDecimal bgBigDecimal bgint scaleRoundingMode roundingMode){ BigDecimal result = bgmultiply(bg); int intLength = getLongLength(result); MathContext context = new MathContext(intLength+scaleroundingMode); result = resultround(context); return result; }需要特别指出的是 numericalValuetoPlainString(); toPlainString() 不会返回XXEXX的科学技术法的形式 |