- 讲师:刘萍萍 / 谢楠
- 课时:160h
- 价格 4580 元
特色双名师解密新课程高频考点,送国家电网教材讲义,助力一次通关
配套通关班送国网在线题库一套
百度广告
考试吧整理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的科学技术法的形式
责编:罗莉
课程专业名称 |
讲师 |
课时 |
查看课程 |
---|
课程专业名称 |
讲师 |
课时 |
查看课程 |
---|
点击加载更多评论>>