今天在看八股文的时候,发现了一个很有趣的东西,就是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?