首页 > 编程知识 正文

double精度问题(javadouble范围)

时间:2023-05-06 07:47:00 阅读:104077 作者:3571

原文: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

}

打印结果值

就像预期结果值一样,解决了双数据加减时精度损失的问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。