首页
编程语言

分类

当前位置: 天天编程网 > 技术新闻 > 编程语言 >正文

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

更新时间:2024-09-27  作者:佚名   来源: 网络转载

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));
}

}
完整运行结果:
Java中浮点数运算存在的精度问题以及解决方法
想不到吧,最后的运行结果居然是这样一堆奇奇怪怪的小数
解答:这是因为因为浮点数在计算机内部是以二进制形式存储的,某些十进制小数无法精确表示。因此,直接运算可能会导致不精确的结果。
解决方法
这里给出三种简单的处理方法
方法一:四舍五入
使用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); } }
结果如下图:
Java中浮点数运算存在的精度问题以及解决方法
注意:直接使用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

上一篇:标准库之 random 模块 下一篇:字符串
小编推荐
快速导航更多>>
JavaScript 教程 HTML5 教程 CSS3 教程 jQuery 教程 Vue.js 教程 Node.js 教程 SQL 教程 C 教程 PHP 教程 Linux 教程 Docker 教程 Nginx 教程 Python 教程 Java 教程

天天编程网 版权所有

陕ICP备2023002928号-1