舍入和“Double.valueOf with float”

时间:2013-06-12 15:36:30

标签: java double floating-point-precision value-of

在Java 6中,只有两个Double#valueOf方法: Double#valueOf(double)Double#valueOf(String)

1 - 当我执行Double#valueOf(float)

时,Witch方法正在调用

根据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

中的字符串

1 个答案:

答案 0 :(得分:3)

  

根据Javadoc,它似乎是Double#valueOf(String)但是Eclipse与Double#valueOf(double)链接。

我无法在Javadoc中找到这样的位置,它表明在这种情况下会调用String重载,但Eclipse是正确的:没有从float到{{的隐式转换1}},但是存在从Stringfloat的隐式转换,因此double是正确的重载。

  

使用float循环结果调用Double.valueOf

它不会“舍入”结果,而是将其表示更改为适合Double#valueOf(double),其具有更高的精度。但是,doublefloat都不能完全代表double,因为它不能表示为0.1的负幂之和。如果您使用2代替0.25,则不会发生这种情况,因为0.10.25,因此可以在2 ^ -2和{{{ 1}}。