在Java 6中,只有两个Double#valueOf方法:
Double#valueOf(double)
和Double#valueOf(String)
。
1 - 当我执行Double#valueOf(float)
?
根据Javadoc,它似乎是Double#valueOf(String)
但是Eclipse与Double#valueOf(double)
链接。
2 - 为什么会出现这些差异?
使用float循环调用Double.valueOf
:
System.out.println(Double.valueOf(0.63F)); // displays 0.6299999952316284
而
System.out.println(Double.valueOf(String.valueOf(0.63F))); // displays 0.63
从javadoc中提取(http://docs.oracle.com/javase/6/docs/api/java/lang/Double.html#valueOf(java.lang.String)):
the float literal 0.1f is equal to the double value 0.10000000149011612
和
字符串is regarded as representing an exact decimal value in the usual "computerized scientific notation" or as an exact hexadecimal value; this exact numerical value is then conceptually converted to an "infinitely precise" binary value that is then rounded to type double by the usual round-to-nearest rule of IEEE 754 floating-point arithmetic
答案 0 :(得分:3)
根据Javadoc,它似乎是
Double#valueOf(String)
但是Eclipse与Double#valueOf(double)
链接。
我无法在Javadoc中找到这样的位置,它表明在这种情况下会调用String
重载,但Eclipse是正确的:没有从float
到{{的隐式转换1}},但是存在从String
到float
的隐式转换,因此double
是正确的重载。
使用float循环结果调用Double.valueOf
它不会“舍入”结果,而是将其表示更改为适合Double#valueOf(double)
,其具有更高的精度。但是,double
和float
都不能完全代表double
,因为它不能表示为0.1
的负幂之和。如果您使用2
代替0.25
,则不会发生这种情况,因为0.1
为0.25
,因此可以在2 ^ -2
和{{{ 1}}。