1

有人可以解释一下在java中为什么

     if(0.6 <= 0.6f ) System.out.printf("true");
     else System.out.printf("false");

这打印的是真的,但是

    if(0.7 <= 0.7f ) System.out.printf("true");
    else  System.out.printf("false");

这打印错误

浮点数转换为double进行比较时是否与IEEE 754标准有关?

有人可以详细解释它的确切工作吗?

4

1 回答 1

14

当然 - 这只是理解0.6、0.6f、0.7 和 0.7f 都不是这些精确值的问题。它们是适当类型中最接近的可表示近似值。为这 4 个值存储的确切值是:

0.6f => 0.60000002384185791015625
0.6  => 0.59999999999999997779553950749686919152736663818359375
0.7f => 0.699999988079071044921875
0.7  => 0.6999999999999999555910790149937383830547332763671875

有了这些信息,就很清楚为什么你会得到你现在的结果。

换一种方式考虑,假设您有两种十进制浮点类型,一种精度为 4 位,另一种精度为 8 位。现在让我们看看如何表示 1/3 和 2/3:

1/3, 4dp => 0.3333
1/3, 8dp => 0.33333333
2/3, 4dp => 0.6667
2/3, 8dp => 0.66666667

因此,在这种情况下,低精度值比高精度值小 1/3,但 2/3 则相反。和 是同样的事情floatdouble只是在二进制中。

于 2013-05-22T17:39:55.123 回答