20

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);
}

Ubuntu11.04のJava6アップデート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

同じシステムのJava7で

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
4

2 に答える 2

13

これは、Java1.3のバグとして識別されました-Java6:http://bugs.java.com/view_bug.do?bug_id= 4428022 </ p>

編集:これが発生する理由については、OpenJDK 6から移植されたバグレポートで参照されている修正があります:http://hg.openjdk.java.net/jdk6/jdk6/jdk/rev/8159687b6316

オフバイワンエラーであることが判明しました。(修正により<=が<に変更されます)。

于 2011-09-27T05:53:01.770 に答える
4

興味のある方のために、doubleの文字列表現の作成を担当するFloatingDecimalクラス間の差分を次に示します。差分からわかるように、パッチは、dtoa()メソッドで指数が-3の場合に発生する特殊なケースを修正します。

于 2011-09-27T06:23:33.933 に答える