Java中浮点数运算存在的精度问题以及解决方法

观察以下一段代码,相信小朋友都可以一眼看出答案,但是计算机给出的答案是这样吗?

public class TestDouble {

public static void main(String args\[\]) {

System.out.println("0.05 + 0.01 = " + (0.05 + 0.01));

System.out.println("1.0 - 0.42 = " + (1.0 - 0.42));

System.out.println("4.015 * 100 = " + (4.015 * 100));

System.out.println("123.3 / 100 = " + (123.3 / 100));

}

}

完整运行结果:

想不到吧,最后的运行结果居然是这样一堆奇奇怪怪的小数

解答:这是因为因为浮点数在计算机内部是以二进制形式存储的,某些十进制小数无法精确表示。因此,直接运算可能会导致不精确的结果。
解决方法

这里给出三种简单的处理方法
方法一:四舍五入

使用Math.round()对结果进行四舍五入

以上述代码为例进行修改:
public class TestDouble { public static void main(String args[]) { System.out.println("0.05 + 0.01 = " + Math.round((0.05 + 0.01)*100.0)/100.0); System.out.println("1.0 - 0.42 = " + Math.round((1.0 - 0.42)*100.0)/100.0); System.out.println("4.015 * 100 = " + Math.round((4.015 * 100)*100.0)/100.0); System.out.println("123.3 / 100 = " + Math.round((123.3 / 100)*1000.0)/1000.0); } }

结果如下图:

注意:直接使用Math.round时只保留整数
方法二:使用BigDecimal 类

`import java.math.BigDecimal;

import java.math.RoundingMode;

复制代码
public class BigDecimalRoundExample {

    public static void main(String[] args) {
        double num = 0.5 + 0.1;
        BigDecimal bd = new BigDecimal(Double.toString(num));
        BigDecimal x = bd.setScale(2, RoundingMode.HALF_UP);//2表示要保留的小数位数

        System.out.println(x); 
    }
}

`

结果:

0.06

相关推荐
阿维的博客日记2 小时前
Hippo4j 线程池监控平台部署手册
java·spring boot·后端
C+++Python5 小时前
详细介绍一下Java泛型的通配符
java·windows·python
JosieBook5 小时前
【数据库】时序预测能力的分级进化:TimechoAI如何让每一类用户都能精准预见未来
java·开发语言·数据库
一生了无挂6 小时前
Java处理JSON技巧教学(从基础到高阶实战全覆盖)
java·开发语言·json
李白的天不白7 小时前
使用 SmartAdmin 进行前后端开发
java·前端
swordbob7 小时前
Spring 单例 Bean 是线程安全的吗?
java·开发语言
2601_951643777 小时前
Python第一,Java跌出前三,C语言杀回来了
java·c语言·python·编程语言排行·技术趋势
IT 行者9 小时前
GitHub Spec Kit 实战(五):/speckit.tasks 怎么拆——Spec Kit 五部曲收官
java·ai编程·claude
(Charon)10 小时前
【C++ 面试高频基础:指针、引用、const、static、new/delete 总结】
java·开发语言
Yeats_Liao10 小时前
Feed流系统设计(三):数据模型与存储设计,从表结构到Redis收件箱
java·javascript·redis