问题描述
- System.out.printIn(1.5==1.5f);为什么结果为true?
-
System.out.printIn(1.4==1.4f);//结果为false
只要是小数为.5的比较就是true,其他都是false,难道.5的时候就不把他看成double型了么?
解决方案
1.4是double,1.4f是float,运用==比较前会对1.4f转换为double,再比较,这个过程有进制转换误差,因为0.4不能用一个二进制有限小数表示,所以随机可能相等可能不等
1.5肯定是相等的,因为0.5 0.25 0.125... 等转换成二进制可以除尽,所以没有进制转换误差。
解决方案二:
我们可以类比下,比如我们用30进制,计算机用10进制。(实际上计算机用二进制我们用10进制)
那么在30进制下的0.1相当于10进制下的1/30,就是0.033... 你可以设想,我们有两种精度一个是小数点保持4位,那么就是0.0333,再转换为8位就是0.03330000,一个是小数点保持8位的,就是0.03333333,两者比较当然不等。
但是30进制下的0.3,十进制就是0.1,那么4位就是0.1000,8位就是0.1000000,4位的那个转换为8位就是0.10000000,结果比较就是相等的。
解决方案三:
浮点数小数部分是0.5×0+0.25×0+0.125×1+……+0.5×(1 or 0)/n+……表示的, 1.4或其他的数是用这个式子无限逼近表示的, 所以1.5==1.5f 成立 ,其他的数字 1.25 ,1.875 等等都是成立的
解决方案四:
System.out.println((double)1.4f); //1.399999976158142
System.out.println(1.399999976158142==1.4f); //true
System.out.println(1.4==1.4f); // false
System.out.println((double)1.4==1.4f); // false
System.out.println((double)1.4>1.4f); // true
我在机器上跑了下
浮点数小数部分是0.5×0+0.25×0+0.125×1+……+0.5×(1 or 0)/n+……表示的, 1.4或其他的数是用这个式子无限逼近表示的, 所以1.5==1.5f 成立 ,其他的数字 1.25 ,1.875 等等都是成立的
解决方案五:
System.out.println((double)1.4f); //1.399999976158142
System.out.println(1.399999976158142==1.4f); //true
System.out.println(1.4==1.4f); // false
System.out.println((double)1.4==1.4f); // false
System.out.println((double)1.4>1.4f); // true
我在机器上跑了下
浮点数小数部分是0.5×0+0.25×0+0.125×1+……+0.5×(1 or 0)/n+……表示的, 1.4或其他的数是用这个式子无限逼近表示的, 所以1.5==1.5f 成立 ,其他的数字 1.25 ,1.875 等等都是成立的
解决方案六:
浮点都是不精确的,没法直接比较
1.5==1.5f是不是相等,看你运气
解决方案七:
Must use JDK 1.5.x or higher to build Openfire
----------------------