关于BigDecimal的不精确计算问题
百度广告
考试吧整理Java认证辅导资料
关于BigDecimal 的不精确计算问题
view plaincopy to clipboardprint?
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);
}
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;
}
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的科学技术法的形式
编辑推荐:
温馨提示:因考试政策、内容不断变化与调整,长理培训网站提供的以上信息仅供参考,如有异议,请考生以权威部门公布的内容为准! (责任编辑:长理培训)
点击加载更多评论>>