原文:https://blog.csdn.net/yacolspace/article/details/78287394
双数据加减运算精度损失
今天在项目中使用双数据加减运算时,遇到了一个奇怪的问题,比如1 20.2 300.03。理论上结果应该是321.23,实际上不是。
public double add(){ 0
doublenumber1=1
doublenumber2=20.2
doublenumber3=300.03
双重结果=数字1数字2数字3;
System.out.println(结果);
返回结果;
}
打印结果如下:
这是为什么?怎么解决?
在Java中使用double操作时,经常会出现精度损失的问题,总是会偏离一个正确的结果0.0000**1。浮点和双精度只能用于科学计算或工程计算。在商业计算中,我们应该使用Java . math . big decimal big decimal中有四种充分的方法,我们只考虑两种方法进行比较,即
双十进制
将adoubleintoa翻译成BigDecimal。
大十进制(字符串值)
将大十进制的字符串表示转换为大十进制。
上面对API的简要描述是相当清晰的,通常情况下,上面的那个更方便使用。我们可能会不假思索地使用它。有什么问题?
BigDecimal构造函数的文档现已发布,供您参考。
解决办法
我相信我们已经从上述文件中找到了解决方案。当我们需要精确表示两位小数时,我们需要将它们转换成BigDecimal对象,然后对它们进行操作。
另外需要注意的是,在使用BigDecimal(double val)构造函数时,还是会有精度损失的问题,所以建议使用BigDecimal(String val)。这要求将double转换为字符串,然后用作BigDecimal(String val)构造函数的参数。转换成BigDecimal对象然后加减乘除,这样精度就不会有问题了。这就是为什么BigDecimal被用于货币的数据存储。
当处理双数据的加、减、乘和除运算时,使用以下方法:
/**
*加法运算
*@paramm1
*@paramm2
* @返回
*/
publicationstatiddoubleadddouble(double m1,double m2){ 0
big decimal P1=new big decimal(double . tostring(m1));
big decimal p2=new big decimal(double . tostring(m2));
returnp1.add(p2)。double value();
}
/**
*减法运算
*@paramm1
*@paramm2
* @返回
*/
publicationstatiddoublesubdouble(double m1,double m2){ 0
big decimal P1=new big decimal(double . tostring(m1));
big decimal p2=new big decimal(double . tostring(m2));
returnp1 .减法(p2)。double value();
}
/**
*乘法
*@paramm1
*@paramm2
* @返回
*/
publicationstatiddoublemul(double m1,double m2){ 0
big decimal P1=new big decimal(double . tostring(m1));
big decimal p2=new big decimal(double . tostring(m2));
returnp1 .乘法(p2)。double value();
}
/**
*除法运算
*@paramm1
*@paramm2
*@paramscale
* @返回
*/
publicationstatiddoublediv(double m1,doublem2,int scale){ 0
if(标度0){ 0
thrownewIllegalArgumentException('参数错误');
}
big decimal P1=new big decimal(double . tostring(m1));
big decimal p2=new big decimal(double . tostring(m2));
returnp1.divide(p2,scale,BigDecimal。ROUND_HALF_UP)。double value();
}
验证文章开头提到的问题已经解决,
public DoubleAddDouble(){ 0
doubleresult1=add(1,20.2);
doubleresult2=add(result1,300.03);
System.out.println('使用BigDecimal时的结果值:' result 2 ');
returnresult2
}
打印结果值
就像预期结果值一样,解决了双数据加减时精度损失的问题。