Почему некоторые числа с плавающей запятой появляются с завершающим 0

Кто-нибудь знает, почему цифры от 0,001 до 0,009 отображаются в String с конечным 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

EDIT Код для DecimalFormat не зависит от языкового стандарта. Если я запустил

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

на Java 6 update 26 на Ubuntu 11.04 Я получаю

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

Ответ 1

Это было определено как ошибка в 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

Выключает его по отдельности. (Исправление изменяется <= до <).

Ответ 2

Для тех, кого интересует, здесь существует diff между классом FloatingDecimal, ответственным за создание строкового представления double. Как вы можете видеть из diff, исправление исправляет специальный случай, который встречается, когда показатель составляет -3 в методе dtoa().