Java中 3*0.1 == 0.3 返回值 false ,1*0.3 == 0.3 返回值 true——学习笔记

Java中浮点数运算可能存在精度问题,例如3*0.1不等于0.3,而1*0.3等于0.3。这是因为某些浮点数无法精确表示,导致计算结果出现不期望的尾数。开发者应避免在需要精确比较的场景下使用浮点数运算。

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

今天发现了一个有趣的东西。
看下面的代码:

	/**
     *
     * @author lixiang
     * @date 2019年05月31日 - 10:15
     * @history 2019年05月31日 - 10:15 lixiang create.
     */
    public static void main(String[] args) {
        System.out.print(1*0.1 == 0.1); System.out.println(" " + 1*0.1);
        System.out.print(2*0.1 == 0.2); System.out.println(" " + 2*0.1);
        System.out.print(3*0.1 == 0.3); System.out.println(" " + 3*0.1);
        System.out.print(4*0.1 == 0.4); System.out.println(" " + 4*0.1);
        System.out.print(5*0.1 == 0.5); System.out.println(" " + 5*0.1);
        System.out.print(6*0.1 == 0.6); System.out.println(" " + 6*0.1);
        System.out.print(7*0.1 == 0.7); System.out.println(" " + 7*0.1);
        System.out.print(8*0.1 == 0.8); System.out.println(" " + 8*0.1);
        System.out.print(9*0.1 == 0.9); System.out.println(" " + 9*0.1);
    }

运行结果:

true 0.1
true 0.2
false 0.30000000000000004
true 0.4
true 0.5
false 0.6000000000000001
false 0.7000000000000001
true 0.8
true 0.9

发现3*0.1 和 6*0.1 和 7*0.1出现了很长一串尾巴。

再看下面代码:

    /**
     *
     * @author lixiang
     * @date 2019年05月31日 - 10:15
     * @history 2019年05月31日 - 10:15 lixiang create.
     */
    public static void main(String[] args) {
        System.out.print(0.3*1 == 0.3); System.out.println(" " + 1*0.3);
        System.out.print(3*0.1 == 0.3); System.out.println(" " + 3*0.1);
        System.out.print(0.6*1 == 0.6); System.out.println(" " + 1*0.6);
        System.out.print(6*0.1 == 0.6); System.out.println(" " + 6*0.1);
        System.out.print(0.7*1 == 0.7); System.out.println(" " + 0.7*1);
        System.out.print(7*0.1 == 0.7); System.out.println(" " + 7*0.1);
    }

运行结果:

true 0.3
false 0.30000000000000004
true 0.6
false 0.6000000000000001
true 0.7
false 0.7000000000000001

很有趣哈。3*0.1 == 0.3 为false 0.3*1 == 0.3 为true,
网上给出的观点是:

有些浮点数不能完全精确的表示出来。

因此,我们应该避免在代码中使用上面出现的这种浮点数运算。
然后求知欲又让我找了这篇知乎,确实这才是真大牛!
为什么java里面30.1=0.30000000000000004,而40.1=0.4?
感觉自己是个假的程序猿,泪奔。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值