神奇的运算:在Java中 ,3*0.1 == 0.3 返回值 false ,1*0.3 == 0.3 返回值 true?

文章探讨了Java中浮点数运算的精度问题,例如3*0.1不等于0.3,而1*0.3等于0.3,这涉及到浮点数表示和Java设计机制。解决方案是使用BigDecimal来确保精确计算。此外,还提到了Integer对象比较的特性,不同的实例可能比较结果不同,这与Integer缓存机制相关。
摘要由CSDN通过智能技术生成

        今天在看八股文的时候,发现了一个很有趣的东西,就是3*0.1==0.3的返回值是什么,带着疑惑,我打开了我的idea。

        在控制台里输出了3*0.1==0.3的结果,结果出乎意料!并不是true,结果而是false。抱着尝试的想法,我在控制台输出了0.1*3==0.3的结果,结果同样出乎意料,答案是true,而不是false。接着我便做了一系列的测试。

/**
 * @author zz_Pig
 * @date 2023年04月3日 - 9:50
 */
public class Test {
    public static void main(String[] args) {
        System.out.println(3 * 0.1);          //0.30000000000000004
        System.out.println(1 * 0.3);          //0.3
        System.out.println(3 * 0.1 == 0.3);   //false
        System.out.println(1 * 0.3 == 0.3);   //true
        System.out.println("-------------");

        System.out.println(4 * 0.1);          //0.4
        System.out.println(1 * 0.4);          //0.4
        System.out.println(4 * 0.1 == 0.4);   //true
        System.out.println(1 * 0.4 == 0.4);   //true
        System.out.println("-------------");

        System.out.println(7 * 0.1);           //0.7000000000000001
        System.out.println(1 * 0.7);           //0.7
        System.out.println(7 * 0.1 == 0.7);    //false
        System.out.println(1 * 0.7 == 0.7);    //true
        System.out.println("-------------");

        System.out.println(11 * 0.1);          //1.1
        System.out.println(1 * 1.1);           //1.1
        System.out.println(11 * 0.1 == 1.1);   //true
        System.out.println(1 * 1.1 == 1.1);    //true
    }
}

        显然,疑惑更重了。于是翻看了问题的答案,答案里面说的是:因为有些浮点数不能完全精确的表示出来。

        这样的答案并不能解决我的疑惑,同样不能满足我的求知欲,接着我便在网上各种地方搜索更为详细的答案,但是都如出一辙,只做了浅显的解答。

        最终还是在我的不懈坚持下,找到了一篇对这个问题有深入探讨的文章。文章的大概讲的东西是:3*0.1 == 0.3 返回值 false ,1*0.3 == 0.3 返回值 true的原因一方面是和浮点数的表示有关,另外一方面是和Java的设计机制有关。想要解答这个问题的前提是,我们得先要知道浮点数是要如何表示的。了解完了浮点数的机制后,又涉及到了控制台输出一方面的问题。

        到了这里,我们可以明白,有时候我们想的,结果不一定是我们想的。对于浮点数的运算,如果是在业务中进行某些比较的时候,碰到了一个很大的数乘上一个浮点数,那么就可能会造成误差,解决方案就是我们可以使用Bigdecimal,里面提供了很多的转换方法,就是为了避免我们上面说到这些问题。

        其实除去上面这个比较带有疑惑的点之外,在Java里面也有很多让我们意想不到的"比较",例如Integer i1=100与Integer i2=100,比较结果为true,而Integer  i3=200与Integer i4=200返回的结果却是false,具体涉及到的是Integer这个类的设计,感兴趣的朋友们也可以去网上查一下。

        没想到小小的一个问题,竟然暗藏玄机!大家也可以看一下那篇文章的具体内容,这里就不做过多的解释,链接如下:为什么java里面3*0.1=0.30000000000000004,而4*0.1=0.4?

        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值