2013-02-08 7 views
16

この簡単なプログラムを実行:なぜ新しいBigDecimal( "0.0")。stripTrailingZeros()のスケールは1ですか?

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 

私の質問はかなり単純です:なぜいない第三println出力0?それは論理的と思われる...

EDIT:OK、そう、これは非常に古いバグです:

Bug Link

と実際には、そのゼロの任意の数の "作品":new BigDecimal("0.0000").stripTrailingZeroes().scale() 4です!

+1

[BigDecimal.stripTrailingZeroes()の動作の明確化](http://stackoverflow.com/questions/5239137/clarification-on-behavior-of-bigdecimal-striptrailingzeroes) –

+2

Andrewがリンクしている質問は確かに同じですが、受け入れられた答えが間違っていることに注意してください。表示される動作は、他の回答に記載されているバグです:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6480539 – jarnbjo

答えて

8

実際には、 "0.0"はstripTrailingZeroを持たないため例外です。 バグ!

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さんのコメントを見る

+4

これは既知のバグです:http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=6480539 –

+1

@AaronDigulla lol、2006年以降のバグ。そして、 'Java 8'でのみ修正される予定です。 – Andremoniy

+3

@Andremoniy:それに数えてはいけません;-) –