在 Java 6 中只有两个 Double#valueOf 方法:
Double#valueOf(double)
和 Double#valueOf(String)
。
1 - 当我执行 Double#valueOf(float)
时调用 Witch 方法?
根据 Javadoc,它似乎是 Double#valueOf(String)
但 Eclipse 链接到 Double#valueOf(double)
。
2 - 为什么会有这些差异?
调用 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)):
浮点字面量 0.1f 等于 double 值 0.10000000149011612
和
param 中的字符串被视为表示通常“计算机科学计数法”中的精确十进制值或精确的十六进制值;然后这个精确的数值在概念上被转换为一个“无限精确”的二进制值,然后通过 IEEE 754 浮点运算的通常舍入到最近的规则将其四舍五入为类型 double
最佳答案
According to Javadoc, it seems to be
Double#valueOf(String)
but Eclipse links withDouble#valueOf(double)
.
我在 Javadoc 中找不到建议 String
的地方在这种情况下会调用重载,但 Eclipse 是正确的:不存在从 float
的隐式转换。至 String
, 但存在从 float
的隐式转换至 double
, 所以 Double#valueOf(double)
是正确的重载。
Calling Double.valueOf with float round the result
它不会“舍入”结果,它会更改其表示以适合 double
, 具有更高的精度。然而,float
也不double
可以代表 0.1
确切地说,因为它不能表示为 2
的负幂之和.如果你使用 0.25
而不是 0.1
,这不会发生,因为 0.25
是2 ^ -2
, 因此可以在 float
中精确表示和 double
.
关于java - 四舍五入和 "Double.valueOf with float",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069618/