关于java float类型的比较

本文探讨了Java中float和double类型的精度限制,通过实例演示了直接比较浮点数可能导致的错误结果,揭示了精度丢失的原因,并提供了正确的比较方法。

关于java的浮点类型处理,一般处理计算会想到使用BigDecemal,但是如果是比较呢?

可能会直接使用==,>等符号直接进行比较运算。可以执行下面的代码查看结果: 

public static void main(String[] args) {
        computer(2.00023434239f, 2.00023434233f);
        System.out.println("--------------------------------");
        computer(2.00023f,2.00022f);
    }


    public static void computer(float f1, float f2) {
        System.out.println("使用==比较结果:" + (f1 == f2));
        System.out.println("使用Math.abs() > 0比较:" + (Math.abs(f1 - f2) > 0));
        System.out.println("使用Math.abs() < 0比较:" + (Math.abs(f1 - f2) < 0));
        System.out.println("使用Math.abs() = 0比较:" + (Math.abs(f1 - f2) == 0));
        System.out.println("使用>比较:" + (f1 > f2));
        System.out.println("使用<比较:" + (f1 < f2));
    }
使用==比较结果:true
使用Math.abs() > 0比较:false
使用Math.abs() < 0比较:false
使用Math.abs() = 0比较:true
使用>比较:false
使用<比较:false
--------------------------------
使用==比较结果:false
使用Math.abs() > 0比较:true
使用Math.abs() < 0比较:false
使用Math.abs() = 0比较:false
使用>比较:true
使用<比较:false

结果很奇怪。

 为什么第一次调用computer的结果会和想的不一样,但是第二次调用和正常的一样。

可以看到两次调用的参数小数点后的位数不一样,很自然的可以想到是精度的问题。所以使用java的浮点类型进行比较的时候不能直接比较。

断点查看两个参数,可以看到小数点后六位是正确的,之后的精度都丢失了。 

float的小数位只有23位,即二进制的23位,能表示的最大的十进制数为2的23次方,即8388608,即十进制的7位,严格点,精度只能百分百保证十进制的6位运算。

double的小数位有52位,对应十进制最大值为4 503 599 627 370 496,这个数有16位,所以计算精度只能百分百保证十进制的15位运算。

 

参考资料:

https://blog.csdn.net/tianmd_Eric/article/details/79729827

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值