养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

Java如何处理浮点数运算的精度问题

时间:2024-11-02 01:26:43

Java在进行浮点数运算时(使用float或double),会出现精度缺失的问题,在部分业务场景中(尤其与钱的计算相关的场景),这个精度问题会造成很多困惑,这篇经验就告诉你如何构建一个没有精度问题的浮点数运算类。

工具/原料

Java,Eclipse

方法/步骤

1、我们先看看Java中直接使用double进行浮点数运算时,出现的精度问题,测试代码如下:privatevoidtestAccuracyProblem(){doubled1=0.01;doubled2=0.05;doubled3=0.06;if(Double.compare((d1+d2),d3)==0){System.out.println("两个数字相等!");}else{System.out.println("两个数字不相等!");}}上述代码运行后,输出了"两个数字不相等!",这就是Java中浮点运算的精度问题。

Java如何处理浮点数运算的精度问题

2、为了处理浮点数运算的精俣觊鄄幼度问题,Java推出了BigDecimal类,我们先将上述类中的浮点数表示换成BigDecimal类,再看看效果:privatevoidte霜杼厮贿stAccuracyProblem(){BigDecimalb1=newBigDecimal(0.01);BigDecimalb2=newBigDecimal(0.05);BigDecimalb3=newBigDecimal(0.06);if(b1.add(b2).compareTo(b3)==0){System.out.println("两个数字相等!");}else{System.out.println("两个数字不相等!");}}上述代码运行后,输出的竟然还是"两个数字不相等!"

Java如何处理浮点数运算的精度问题

3、为啥使用BigDecimal类还出现精度问题呢?问题出在这个构造函数上,我们使用一个double浮点数作为参数的构造函数来创建BigDecimal对象,这个构造函数创建的对象精度本身就有问题,相关API文档对这个问题也有描述(详见图示)。

Java如何处理浮点数运算的精度问题

4、那该怎么办呢?BigDecimal建议瘫蝠熨夯我们使用字符串参数的构造函数,代码如下:privatevo足毂忍珩idtestAccuracyProblem(){BigDecimalb1=newBigDecimal(String.valueOf(0.01));BigDecimalb2=newBigDecimal(String.valueOf(0.05));BigDecimalb3=newBigDecimal(String.valueOf(0.06));if(b1.add(b2).compareTo(b3)==0){System.out.println("两个数字相等!");}else{System.out.println("两个数字不相等!");}}

Java如何处理浮点数运算的精度问题

5、由此,我们通过BigDecimal构建一个摆脱精度困扰的浮点数运算工具类,对应浮点数的四则运算,相关代码请参考图示。

Java如何处理浮点数运算的精度问题

Java如何处理浮点数运算的精度问题

Java如何处理浮点数运算的精度问题

Java如何处理浮点数运算的精度问题

© 一点知识