2011-03-08 10 views
6

Perché il codice seguente stampa 0.00 e non 0?Chiarimento sul comportamento di BigDecimal.stripTrailingZeroes()

BigDecimal big = new BigDecimal("0.00"); 
big = big.stripTrailingZeros(); 
System.out.println(big.toPlainString()); 

che segue è la documentazione per stripTrailingZeroes:

ritorni BigDecimal che è numericamente uguale a questo ma con tutti zeri finali rimossi dalla rappresentazione. Ad esempio, eliminando gli zeri finali dal valore BigDecimal 600.0, che ha componenti [BigInteger, scale] uguale a [6000, 1], produce 6E2 con [BigInteger, scale] componenti è uguale a [6, -2]

Resi :
un BigDecimale numericamente uguale con eventuali zeri finali rimossi.
+0

@eznme: fisso, è troppo tardi qui :)) – Leonid

+0

Questo appare come un bug a me. Sorprendentemente, il Java Compatibility Kit per Java 1.6 non menziona affatto la funzione 'stripTrailingZeros'. Bene, tranne che il metodo deve esistere, ma niente di più. –

+0

Qual è in genere la procedura per segnalare problemi sospetti con le librerie Java? – Leonid

risposta

0

strappa gli zeri finali del interna rappresentazione [6000,1] e adatta la scala di conseguenza 1 -> -2. Anche la rappresentazione interna è alquanto indipendente dalla stampa finale, anch'essa influenzata dal formato, dagli arrotondamenti e dalle impostazioni internazionali.

+0

Come mai 'toPlainString' dipende da' format' e 'locale'? La modalità Rounding è usata per 'divide' quindi non penso che influisca' toPlainString' in alcun modo. Infatti, dal codice sorgente di 'toPlainString' non sembra che sia così. – Leonid

+0

Non intendo con PlainString. Intendo l'output formattato; in produzione puoi raramente usare toPlainString, normalmente devi rispettare un formato specifico come 1234.567, 123E45 o 0.123 * 10 ** 7; e non si può passare da uno all'altro. –