2013-02-08 4 views
16

in corso questo semplice programma:Perché il nuovo BigDecimal ("0.0"). StripTrailingZeros() ha una scala di 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()); 
} 

uscite:

0 
0 
1 
0 

La mia domanda è piuttosto semplice: perché non la terza uscita println0? Quello sembrerebbe logico ...

EDIT: OK, così, questo è un bug molto antiche:

Bug Link

e di fatto, si "lavora" per qualsiasi numero di zeri: new BigDecimal("0.0000").stripTrailingZeroes().scale() è 4!

+1

possibile duplicato di [Chiarimento sul comportamento di BigDecimal.stripTrailingZeroes()] (http://stackoverflow.com/questions/5239137/clarification-on-behavior-of-bigdecimal-striptrailingzeroes) –

+2

La domanda a cui Andrew sta collegando è in effetti lo stesso, ma sii consapevole che la risposta accettata non è corretta. Il comportamento che vedi è il bug citato nell'altra risposta: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6480539 – jarnbjo

risposta

8

Infatti "0.0" è l'eccezione in quanto non esegue stripTrailingZeroes. Un bug!

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 

fissato in Java 8! Vedere il commento di @ vadim_shb.

+4

È un bug noto: http://bugs.sun.com/bugdatabase/ view_bug.do?bug_id=6480539 –

+1

@AaronDigulla lol, bug dal 2006. E verrà risolto solo in 'Java 8'. – Andremoniy

+3

@Andremoniy: non contare su di esso ;-) –

Problemi correlati