谁能解释一下为什么在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");
这打印错误
float 转为double比较是否与IEEE 754标准有关?
有人可以详细解释它的确切工作原理吗?
当然 - 这只是理解 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
有了这些信息,您就会清楚为什么会得到现在的结果。
换一种方式思考,假设您有两种decimal 浮点类型,一种具有 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 则相反。对于 float
和 double
也是一样的,只是在二进制中。