为什么0.5 == 0.5f为真但0.1 == 0.1f为假?

时间:2015-07-11 12:34:04

标签: java literals

请查看以下两个代码:

public static void main(String... args)
{
   System.out.println(0.5==0.5f);
}

输出:true

 public static void main(String... args)
 {
   System.out.println(0.1==0.1f);
 }

输出:false

为什么会这样?

2 个答案:

答案 0 :(得分:37)

您正在比较两种类型的值:double和float。 考虑不精确数字的大小限制。

一个例子:

确切值(十进制)

value1 - > 1/2与5位小数是0.50000
value2 - > 1/2与10位小数是0.5000000000

然后

value1 == value2 - >返回true

不精确值(十进制)

value3 - > 1/3,5位小数是0.33333
value4 - > 1/3,10位小数是0.3333333333

然后

value3 == value4 - >返回false,因为它们不相同。

0.1不能完全用二进制表示(如十进制中的1/3),但0.5可以是。

0.1d的二进制表示 - > 0.000(1100)1100110011 ...
0.5d的二进制表示 - > 0.1

答案 1 :(得分:18)

这与浮点数以c*2^q形式表示的事实有关。 0.5可以表示为1*2^-1,而0.1无法准确表示,与c和q的大小无关。

将float与double进行比较时,float会被转换为double。如果表示的数字已经可以正确表示为float,则在转换为double时它将具有相同的值,但如果不是,则double将具有一些额外的有效数字,因此将比较不相等。