2015-04-23 11 views
5

Ho appena visto un comportamento all'interno di BigDecimal di cui non ero a conoscenza in precedenza. ve sempre li ha usati come alternativa a raddoppiare per le zone dove la precisione è importante. per esempio in calcoli finanziari.Ci sono altri trucchi simili a BigDecimal ("1.0"). Equals (new BigDecimal ("1") restituisce false?

Tuttavia ho recentemente imbattuto in questo fatto

new BigDecimal("1.0").equals(new BigDecimal("1")) == false 

devo ammettere che sono rimasto sorpreso da questo. Immagino che sia perché il primo ha una scala di 1 mentre il secondo ha una scala di 0, ma sembra comunque contro-intuitivo. Penso che la ragione per cui non ho mai imbattersi in prima è perché abbiamo sempre usato la bilancia fissa BigDecimals per i calcoli finanziari.

Controllo della BigDecimaldocumentation posso vedere che dice che compareTo() == 0 dovrebbero essere utilizzati per verificare la presenza di scala uguaglianza ignorando mentre quello equals() confronta sia il valore e la scala.

Esistono altri trucchi simili di cui dovrei essere a conoscenza quando si utilizzano BigDecimal s con scale diverse?

+1

Non intendi nulla che non sia stato documentato nei documenti Java già credo? – CKing

+4

Un trucco simile è che 'new BigDecimal (0.1)' e 'BigDecimal.valueOf (0.1)' restituiscono risultati diversi.Il primo è una rappresentazione del doppio valore e sarà qualcosa come '0.1000000000000000055511151231257827021181583404541015625' mentre il secondo è' 0.1'. – Powerlord

+2

Correlati (possibile duplicato): http://stackoverflow.com/questions/19818537/why-is-bigdecimal-natural-ordering-inconsistent-with-equals – Maroun

risposta

1

Secondo JavaDoc del equals():

differenza compareTo, questo metodo considera due BigDecimal oggetti uguali solo se sono uguali in valore e scala (quindi 2.0 non è uguale a 2,00 quando confrontati da questo metodo) .

Quindi equals() controlla se gli oggetti sono esattamente lo stesso. compareTo() "only" confronta il loro valore numerico.

+0

Credo che l'OP sappia già la ragione di questo caso particolare. Vuole sapere di altri tali gotha. – CKing

2

BigDecimal è uguale a controlli che il contenuto dei due oggetti BigDecimal sono gli stessi. per esempio. il loro toString() sarebbe lo stesso. Proprio come "1.0" e "1" non sono uguali, né new BigDecimal("1.0").equals(new BigDecimal("1")) come unscaledValue() e getScale() sono entrambi diversi.

Il problema è che, mentre si sapeva che non avrebbe == confrontare il contenuto e si potrebbe essere stato detto .equals è la soluzione per String, non può fare ciò che si intende per BigDecimal.

Per compareTo deve lavorare su ciò che è maggiore o minore di e poiché i valori non sono né maggiori né minori di quanto possano essere uguali (ma non uguali).