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

相关推荐
好看资源平台6 分钟前
Spring 全家桶使用教程 —— 后端开发从入门到精通
java·数据库·spring
Satan7129 分钟前
【Spring】Spring Aop基础入门
java·开发语言·jvm
这河里吗l17 分钟前
Java每日面试题(JVM)(day15)
java·开发语言·jvm·笔记·后端
white__ice20 分钟前
2024.9.27
java
robot_大菜鸟34 分钟前
Powerbi -l9-异常数据的处理
android·java·powerbi
江南一点雨36 分钟前
又一家培训机构即将倒闭!打工人讨薪无果,想报名的小伙伴擦亮眼睛~
java·程序员
Satan7121 小时前
【Java】JVM基本组成
java·开发语言·jvm
@月落1 小时前
获取douyin商品详情:API接口的力量
java·前端·数据库
hakesashou1 小时前
python命令行怎么换行
java·前端·python
yang-23071 小时前
ElasticSearch安装分词器与整合SpringBoot
java·spring boot·elasticsearch·jenkins