Java处理浮点数的比较

本文揭示了Java中直接比较浮点数可能导致的不准确结果,通过两个实例介绍了如何使用精度估计和BigDecimal类来解决这一问题,确保数值比较的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java在比较浮点数的时候,会出现问题,我们看下面的例子:

public class DoubleLean {
    public static void main(String[] args) {
        double a=1.23d;
        double b=1.21d;
        double c=a-b;

        //浮点数比较,不靠谱
        if (c==0.02d){
            System.out.println("相等");
        }else{
            System.out.println("不相等");
        }
    }
}

输出的结果,不相等,所以,永远不要这么去比较浮点数,坑死人。

那怎么解决这种问题的呢?

一般可以用两种方式,

一,使用精度估计,只要两个浮点数相差 在一定的精度内的话,我们就认为他们相等。

public class DoubleLean {
    public static void main(String[] args) {
        double a=1.23d;
        double b=1.21d;
        double c=a-b;

        //解决方法,判断 精度
        System.out.println(c);
        if (compare(c, 0.02d, 0.0000001d)) {
            System.out.println("相等");
        }else{
            System.out.println("不相等");
        }
    }

    public static boolean compare(double a,double b,double accuracy){
        if (Double.isNaN(a) || Double.isNaN(b) || Double.isInfinite(a) || Double.isInfinite(b)) {
            return false;
        }
        return Math.abs(a-b)<accuracy;
    }
}

上面的例子中,输出了相等,这个时候,我们可以认为两个变量值相等了。

二、使用java的BigDecimal 比较

import java.math.BigDecimal;

public class DoubleLean {
    public static void main(String[] args) {
        
        BigDecimal aa=new BigDecimal("1.23");
        BigDecimal bb=new BigDecimal("1.21");
        BigDecimal cc=aa.subtract(bb);
        BigDecimal dd=new BigDecimal("0.02");
        if (cc.compareTo(dd)==0){
            System.out.println("相等");
        }else{
            System.out.println("不相等");
        }
    }
}

输出也是相等。

至于Java浮点数相比较为什么会不相等,诸位同学可以度娘下,这里就不过多阐述理论知识了。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值