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

相关推荐
有梦想的骇客4 小时前
书籍“之“字形打印矩阵(8)0609
java·算法·矩阵
yours_Gabriel5 小时前
【java面试】微服务篇
java·微服务·中间件·面试·kafka·rabbitmq
hashiqimiya6 小时前
android studio中修改java逻辑对应配置的xml文件
xml·java·android studio
liuzhenghua667 小时前
Python任务调度模型
java·运维·python
結城7 小时前
mybatisX的使用,简化springboot的开发,不用再写entity、mapper以及service了!
java·spring boot·后端
小前端大牛马7 小时前
java教程笔记(十一)-泛型
java·笔记·python
东阳马生架构7 小时前
商品中心—2.商品生命周期和状态的技术文档
java
星辰离彬7 小时前
Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解
java·spring boot·后端·sql·mysql·性能优化
q_19132846957 小时前
基于Springboot+Vue的办公管理系统
java·vue.js·spring boot·后端·intellij idea