java中double类型数据加减操作精度丢失问题及解决⽅法
double类型数据加减操作精度丢失问题
今天在项⽬中⽤到double类型数据加减运算时,遇到了⼀个奇怪的问题,⽐如1+20.2+300.03,理论上结果应该是321.23,其实结果并不是这样。
public double add(){
double number1 =1;
double number2 =20.2;
double number3 =300.03;
double result = number1 + number2 + number3;
System.out.println(result);
return result;
}
打印结果如下:
这是为什么呢?⼜该如何解决呢?
在使⽤Java中double 进⾏运算时,经常出现精度丢失的问题,总是在⼀个正确的结果左右偏0.0000**1。float和double只能⽤来做科学计算或者是⼯程计算,在商业计算中我们要⽤ java.math.BigDecimal。BigDecimal⼀共有4个够造⽅法,我们只考虑两个进⾏⽐较,分别是
BigDecimal(double val)
Translates a double into a BigDecimal.
BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.
上⾯的API简要描述相当的明确,⽽且通常情况下,上⾯的那⼀个使⽤起来要⽅便⼀些。我们可能想都不想就⽤上了,会有什么问题呢?
现贴出BigDecimal的⼀个构造函数的⽂档供⼤家参考
解决⽅法
相信从上⾯的⽂档⼤家也已经出了解决⽅法,在需要精确的表⽰两位⼩数时我们需要把他们转换为BigDecimal对象,然后再进⾏运算。
另外需要注意,使⽤BigDecimal(double val)构造函数时仍会存在精度丢失问题,建议使⽤BigDecimal(
String val)。这就需要先把double转换为字符串然后在作为BigDecimal(String val)构造函数的参数。转换为BigDecimal对象之后再进⾏加减乘除操作,这样精度就不会出现问题了。这也是为什么有关⾦钱数据存储都使⽤BigDecimal。
处理double类型数据的加、减、乘、除运算时,使⽤如下⽅法:
/**
* 加法运算
* @param m1
* @param m2
* @return
*/
public static double addDouble(double m1,double m2){
BigDecimal p1 =new String(m1));
BigDecimal p2 =new String(m2));
return p1.add(p2).doubleValue();
}
/**
* 减法运算
bigdecimal格式化两位小数* @param m1
* @param m2
* @return
*/
public static double subDouble(double m1,double m2){
BigDecimal p1 =new String(m1));
BigDecimal p2 =new String(m2));
return p1.subtract(p2).doubleValue();
}
/**
* 乘法运算
* @param m1
* @param m2
* @return
*/
public static double mul(double m1,double m2){
BigDecimal p1 =new String(m1));
BigDecimal p2 =new String(m2));
return p1.multiply(p2).doubleValue();
}
/**
* 除法运算
* @param m1
* @param m2
* @param scale
* @return
*/
public static double div(double m1,double m2,int scale){
if(scale <0){
throw new IllegalArgumentException("Parameter error");
}
BigDecimal p1 =new String(m1));
BigDecimal p2 =new String(m2));
return p1.divide(p2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); }
验证⽂章开头提到的问题是否解决,
public double addDouble(){
double result1 =add(1,20.2);
double result2 =add(result1,300.03);
System.out.println("使⽤BigDecimal时结果值:"+ result2);
return result2;
}
打印结果值
跟预想中的结果值⼀样,解决了double类型数据加减操作时精度丢失的问题
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论