为什么Float.valueOf("2.7") > 2.7
给我的确是真的?
public static void main(String[] args) {
System.out.println(Float.valueOf("2.7") > 2.7);
System.out.println(Float.valueOf("2.7") > 2.8);
System.out.println(Float.valueOf("2.7") > 2.6);
}
打印
true
false
true.
如果我Float.valueOf("2.7") > Float.valueOf("2.7")
,则返回false。
有人能帮我理解这种行为吗?
答案 0 :(得分:7)
文字2.7
是double
- 即最接近double
的值为2.7。
Float.valueOf("2.7")
- 或2.7f
,等效地,是与2.7最接近的float
值。它们都不是2.7 - 在这种情况下,它们都略大于2.7。实际值是:
float: 2.7000000476837158203125
double: 2.70000000000000017763568394002504646778106689453125
如您所见,float
值 的值大于double
值。
如果最接近的值低而不是"理想的"一,您将看到相反的效果,其中float
值将小于double
值,因为double
值将更接近"理想& #34;一。例如,您将看到2.8,其值为:
float: 2.7999999523162841796875
double: 2.79999999999999982236431605997495353221893310546875
如果您使用Double.parseDouble
代替Float.parseFloat
- 或者,如果您将比较与float
文字相比较,则应获得预期结果:
System.out.println(Float.valueOf("2.7") > 2.7f);
System.out.println(Double.valueOf("2.7") > 2.7);
答案 1 :(得分:1)
2.7
是双字面的。 Float.valueOf("2.7")
为float
,因此精度较低,这意味着它可以通过高于2.7的双近似值的浮点值近似。
System.out.println(Float.valueOf("2.7") > 2.7f);
会给你错误,因为你会比较两个花车。
答案 2 :(得分:0)
这是因为2.7f
> 2.7d
float
2.7
代表double
略高于float
代表,因为{{1}}不太准确。
答案 3 :(得分:0)
这是由于双精度和浮点数的精确度使得浮点数略高一倍。
您可以尝试使用以下代码。
System.out.println("double: " + new BigDecimal(2.7));
System.out.println("float: " + new BigDecimal(Float.valueOf("2.7")));
System.out.println("double: " + new BigDecimal(2.7d));
System.out.println("float: " + new BigDecimal(2.7f));