18

この単純なプログラムの実行:

public static void main(final String... args)
{
    System.out.println(BigDecimal.ZERO.scale());
    System.out.println(new BigDecimal("0").scale());
    System.out.println(new BigDecimal("0.0").stripTrailingZeros().scale());
    System.out.println(new BigDecimal("1.0").stripTrailingZeros().scale());
}

出力:

0
0
1
0

私の質問はかなり単純です:なぜ3番目のprintln出力がないの0ですか?それは論理的に見えるでしょう...

編集:わかりました、それで、これは非常に古いバグです:

バグリンク

実際、これは任意の数のゼロに対して「機能」します。つまりnew BigDecimal("0.0000").stripTrailingZeroes().scale()4です。

4

1 に答える 1

10

実際、「0.0」は、stripTrailingZeroesを実行しないため、例外です。 バグ!

public static void main(final String... args) {
    p("0");
    p("0.0");
    p("1.0");
    p("1.00");
    p("1");
    p("11.0");
}

private static void p(String s) {
    BigDecimal stripped = new BigDecimal(s).stripTrailingZeros();
    System.out.println(s + " - scale: " + new BigDecimal(s).scale()
        + "; stripped: " + stripped.toPlainString() + " " + stripped.scale());
}

0 - scale: 0; stripped: 0 0
0.0 - scale: 1; stripped: 0.0 1
1.0 - scale: 1; stripped: 1 0
1.00 - scale: 2; stripped: 1 0
1 - scale: 0; stripped: 1 0
11.0 - scale: 1; stripped: 11 0

Java 8で修正されました!@vadim_shbのコメントを参照してください。

于 2013-02-08T12:45:35.137 に答える