为什么有些浮点数出现后跟0

时间:2011-09-27 05:19:32

标签: 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

2 个答案:

答案 0 :(得分:13)

这被认为是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

原来这是一个一个一个错误。 (修正更改&lt; = to&lt;)。

答案 1 :(得分:4)

对于那些感兴趣的人,here is a diff之间的FloatingDecimal类负责创建double的字符串表示。从diff中可以看出,补丁修复了dtoa()方法中指数为-3时遇到的特殊情况。