java - 四舍五入和 "Double.valueOf with float"

标签 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 - 为什么会有这些差异?

调用 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 with Double#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.252 ^ -2 , 因此可以在 float 中精确表示和 double .

关于java - 四舍五入和 "Double.valueOf with float",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17069618/

相关文章:

java - 在java中,使用byte或short而不是int和float而不是double更有效吗?

c - C中的double到int的转换

sql - 在不损失精度的情况下将 SQL Geography Lat/Long 转换为 VARCHAR

c - 使用 float 而不是 double 时出现奇怪的输出

java - Android 如何解释布局中的@null 关键字?

Java、Swing、获取和更改所有输入字段

java - 将 clojure/scala repl 附加到正在运行的 JVM

java - 如何使用查询获取最高行号?

cuda - 如何找到 CUDA 的 epsilon、min 和 max 常量?

c++ - 移植比较 32 位 float 与 64 位 float 的代码,这个值代表什么?