2012-07-31 11 views
5

Estoy obteniendo el resultado incorrecto usando el método a continuación.Obteniendo el resultado incorrecto para la evaluación de los valores de 100 * 2.55

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

Introducir valor del parámetro son: leftOperand = 100 y rightOperand = 2.55

estoy recibiendo Respuesta equivocada: 254,99999999999997

La respuesta correcta es un 255,0

+4

obligatorio "Lo que todo informático debe saber sobre la aritmética de punto flotante" -link: http://docs.sun.com/source/806-3568/ncg_goldberg.html – Jacob

+1

Lo exacta * * Valor hacer crees que tu valor de "2.55" tiene? –

+0

@JonSkeet: Incluso si conoce el valor exacto de 2.55 y 100.0, la respuesta sería incorrecta ... –

Respuesta

4

Esto es debido a floating point precision problem. Es imposible representar cada número racional dentro de los 64 bits. Los números se almacenan dentro del IEEE 754 format.

Si está creando un juego, esto es más que suficiente, incluso la flotación lo hará. Pero si está financiando algo, debería ser correcto. Entonces puede usar java.math.BigDecimal. Es mucho más lento que double pero es correcto. Y requiere mucha más memoria, ya que tiene un valor exacto en la memoria. Aquí hay un buen tutorial sobre cómo usar BigDecimal.

+0

Gracias, su información fue muy útil. – iMBMT

-1

Usando Math.round().

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