2012-07-31 7 views
5

Si ottengono risultati errati utilizzando il metodo seguente.Risultato errato per la valutazione di 100 * 2,55 valori

public double evaluate(final double leftOperand, final double rightOperand) { 
     Double rtnValue = new Double(leftOperand * rightOperand); 
     return rtnValue.doubleValue(); 
    } 

Inserire il valore del parametro sono: leftOperand = 100 e rightOperand = 2.55

sto ottenendo Risposta sbagliata: 254,99999999999997

La risposta corretta è un 255,0

+4

obbligatorio "Quello che ogni computer Scientist dovrebbe sapere aritmetica alla virgola mobile" -LINK: http://docs.sun.com/source/806-3568/ncg_goldberg.html – Jacob

+1

Cosa * * esatto valore fare credi che il tuo valore di "2,55" sia? –

+0

@JonSkeet: Anche se si conosce il valore esatto sia di 2.55 sia di 100.0, la risposta sarebbe errata ... –

risposta

4

Questo è a causa di floating point precision problem. È impossibile rappresentare ogni numero razionale entro 64 bit. I numeri sono memorizzati all'interno di IEEE 754 format.

Se stai creando un gioco, questo è più che buono, anche il float lo farà. Ma se stai facendo un finanziamento, dovrebbe essere corretto. Quindi è possibile utilizzare java.math.BigDecimal. È molto più lento di double ma è corretto. E ci vuole molta più memoria, dal momento che hai un valore esatto in memoria. Ecco un bel tutorial su come usare BigDecimal.

+0

Grazie, le tue informazioni sono state molto utili. – iMBMT

-1

Utilizzo di Math.round().

public static double evaluate(final double leftOperand, final double rightOperand) { 
     Double rtnValue = new Double(leftOperand * rightOperand); 
     return Math.round(rtnValue.doubleValue()); 
    } 
Problemi correlati