请查看以下两个代码:
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
为什么会这样?
答案 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将具有一些额外的有效数字,因此将比较不相等。