Почему некоторые числа с плавающей точкой появляются с завершающим 0 - PullRequest
20 голосов
/ 27 сентября 2011

Кто-нибудь знает, почему числа от 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);
}

в Java 6, обновление 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

Ответы [ 2 ]

13 голосов
/ 27 сентября 2011

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

Оказывается, что это ошибка "один за другим".(Исправление меняется <= на <). </p>

4 голосов
/ 27 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...