为什么 0.5==0.5f 是真的,而 0.1==0.1f 是假的?

2022-09-01 16:44:37

请看以下两个代码:

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

输出: 真

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

输出:假

为什么会这样?


答案 1

您正在比较两种类型的值:双精度值和浮点型值。想想数字不准确的大小限制。

例如:

精确值(十进制)

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

然后

value1 == value2-> 返回 true

不精确的值(十进制)

value3-> 1/3 与 5 位小数是 0.33333
-> 1/3 与 10 位小数是 0.333333333value4

然后

value3 == value4->返回 false,因为它们不一样。

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

-> 0.000(1100)的二进制表示形式1100110011...
-> 0.1 的二进制表示形式0.1d0.5d


答案 2

这与浮点数以形式表示的事实有关。 可以表示为不可能准确表示,而与使c和q有多大无关。c*2^q0.51*2^-10.1

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