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

相关推荐
_遥远的救世主_18 小时前
从一次结果集密集型查询 OOM 看 Java 服务的稳定性架构治理
java·后端
一楼的猫18 小时前
从工具链视角对比:番茄作家助手 vs 第三方写作辅助方案
java·服务器·开发语言·前端·学习·chatgpt·ai写作
likerhood19 小时前
Java static 关键字从浅入深
java·开发语言
_院长大人_19 小时前
Java Excel导出:如何实现自定义表头与字段顺序的完全控制
java·开发语言·后端·excel
磊 子20 小时前
1.4CPU缓存一致性
java·spring cloud·缓存·系统
周末也要写八哥20 小时前
Eclipse 2024全流程网盘下载与安装配置教程详解
java·ide·eclipse
来恩100320 小时前
JSTL的标签库种类
java·开发语言
图像僧20 小时前
vs2019中的属性页使用说明
java·开发语言·jvm
武子康20 小时前
Java-03 深入浅出 MyBatis 增删改查与映射配置详解
java·后端
静心观复20 小时前
.puml文件是什么,怎么用
java