2011-11-10 21 views
25

Eventuali duplicati:
How to resolve a Java Rounding Double issueCome confrontare due valori doppi in Java?

Un semplice confronto tra due valori doppi in Java crea qualche problema. Consideriamo il seguente frammento di codice semplice in Java.

package doublecomparision; 

final public class DoubleComparision 
{ 
    public static void main(String[] args) 
    { 
     double a = 1.000001; 
     double b = 0.000001; 

     System.out.println("\n"+((a-b)==1.0)); 
    } 
} 

Il codice sopra appare restituire true, la valutazione dell'espressione ((a-b)==1.0) ma non lo fa. Restituisce false invece perché la valutazione di questa espressione è 0.9999999999999999 che in realtà era prevista per 1.0 che non è uguale a 1.0 quindi, la condizione restituisce booleano false. Qual è il modo migliore e suggerito per superare una situazione del genere?

+6

Questo perché double e float non possono esprimere ogni valore numerico. Stanno davvero usando le approssimazioni per rappresentare il valore. – onit

risposta

53

In sostanza non si deve fare paragoni esatti, si dovrebbe fare qualcosa di simile:

double a = 1.000001; 
double b = 0.000001; 
double c = a-b; 
if (Math.abs(c-1.0) <= 0.000001) {...} 
+7

Si potrebbe voler dare un'occhiata al metodo di confronto del doppio. Controlla questo link: http://www.tutorialspoint.com/java/lang/double_compare.htm –

+12

Ma se usi Double.compare, nota che (1) Se d1 e d2 rappresentano entrambi Double.NaN, allora il metodo restituisce true, anche se Double.NaN == Double.NaN ha il valore false; e (2) Se d1 rappresenta +0.0 mentre d2 rappresenta -0.0, o viceversa, il metodo restituisce il valore falso, anche se +0.0 == - 0.0 ha il valore true. Questa definizione consente alle tabelle hash di funzionare correttamente. – shiggity

8

Invece di utilizzare i doppi per l'aritmetica decimale, utilizzare java.math.BigDecimal. Produrrebbe i risultati attesi.

Per riferimento dare un'occhiata a questo stackoverflow question

+14

BigDecimal a volte non è una soluzione praticabile. – mcfinnigan