java - 为什么有些 float 出现尾随 0

标签 java floating-point render-to-string

有谁知道为什么数字 0.001 到 0.009 被渲染为带有尾随 0 的字符串,而其他数字却没有。例如数字 0.01 到 0.09 没有。

System.out.println(Locale.getDefault());
for (int i = 0; i <= 20; i++)
    System.out.println(i / 1e3);

打印

en_GB
0.0
0.0010
0.0020
0.0030
0.0040
0.0050
0.0060
0.0070
0.0080
0.0090
0.01
0.011
0.012
0.013
0.014
0.015
0.016
0.017
0.018
0.019
0.02

编辑 DecimalFormat 的代码似乎与语言环境无关。如果我跑

for (Locale l : Locale.getAvailableLocales())   {
    Locale.setDefault(l);
    System.out.println(l + " " + 1 / 1e3);
}

在 Ubuntu 11.04 上的 Java 6 更新 26 我得到

ja_JP 0.0010
es_PE 0.0010
en 0.0010
... many locales with the same result ...
sv_SE 0.0010
da_DK 0.0010
es_HN 0.0010

在我得到的同一系统上的 Java 7 上

ms_MY 0.001
ar_QA 0.001
is_IS 0.001
... many locales with the same result ...
el_CY 0.001
hu 0.001
fr_FR 0.001

最佳答案

这在 Java 1.3 - Java 6 中被确定为一个错误:http://bugs.java.com/view_bug.do?bug_id=4428022

编辑:至于为什么会发生这种情况,这里是从 OpenJDK 6 移植的错误报告中提到的修复:http://hg.openjdk.java.net/jdk6/jdk6/jdk/rev/8159687b6316

事实证明这是一个错误。 (修复将 <= 更改为 <)。

关于java - 为什么有些 float 出现尾随 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7564525/

相关文章:

java - 将 ControllerClassNameHandlerMapping 与 @Controller 一起使用并扩展 AbstractController

java - arr1[i++] = arr2[j++] 背后的逻辑是什么?

c++ - 关于 C++ infinity() 的保证

Java IOException 无限循环

python - 最大科学记数法?

MySQL JSON存储不同的浮点值

ruby-on-rails - 如何使用 render_to_string 在 lib ruby​​ 类中呈现部分

ruby-on-rails - Rails render_to_string

java - Android:将 XML 从原始文件夹转换为字符串

java - 如何在 power mockito 中模拟生成的对象及其属性