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

Anu*_*kla 23 java literals

请看以下两个代码:

public static void main(String... args)
{
   System.out.println(0.5==0.5f);
}
Run Code Online (Sandbox Code Playgroud)

输出:true

 public static void main(String... args)
 {
   System.out.println(0.1==0.1f);
 }
Run Code Online (Sandbox Code Playgroud)

输出:false

为什么会这样?

Dav*_*era 39

您正在比较两种类型的值: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


Voo*_*Voo 19

这与浮点数在表单中表示的事实有关c*2^q.0.5可以表示为1*2^-1虽然0.1不可能准确地表示独立于你制作c和q的大小.

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