2010-07-21 7 views
5
new BigDecimal("37146555.53880000").divide(new BigDecimal("1000000")).scale() 

Restituisce 10. Ma secondo l'API, il metodo divide:Scala() del metodo Divide in BigDecimal

Restituisce un BigDecimal cui valore è (questo/divisore), e la cui preferito scala è (this.scale() - divisor.scale());

Quindi, in questo caso, la scala è 37146555.53880000's8, e la scala 1000000 s' è 0. Quindi il risultato dovrebbe avere una scala 8, non 10.

Cosa mi manca qui?

Grazie

risposta

2

Il risultato effettivo è 37.1465555388 la cui scala deve essere 10 per essere esatta.

Quello che dice JavaDoc è che la scala preferita è la differenza, il che significa che se il risultato non ha effettivamente bisogno di essere 10, allora proverebbe a farlo 8. Ad esempio se si sarebbe diviso per 2, di cui anche la scala è 0, il risultato sarebbe stato 18573277.76940000 (scala 8).

EDIT: piccolo adition - è possibile forzare la divisione di una certa scala utilizzando i metodi divide overload:

  • divide(BigDecimal, RoundingMode) che darà una BigDecimal con scala this e valore arrotondato con il metodo di arrotondamento specificato se il risultato avesse effettivamente bisogno di più decimali per essere esatti.

  • divide(BigDecimal, scale, RoundingMode) che darà un BigDecimal con la scala specificata e il valore arrotondato con il metodo specificato se necessario.

Questo potrebbe essere utile se il dividendo per un numero si sa può causare ripetere decimali, come 3 (1/3 = 0,333,333 mila ...) in quanto, se ciò accade, la semplice divisione genererà un'eccezione. Limitare il numero massimo di decimali ti aiuterà a evitare l'eccezione, ma renderà i calcoli meno precisi.

1

Queste scale sono quelli usati dai metodi che restituiscono aritmetica esatta risultati; eccetto che una divisione esatta potrebbe dover utilizzare una scala più grande dal il risultato esatto potrebbe avere più cifre. Ad esempio, 1/32 è 0,03125.