2011-11-10 26 views
25

Duplicar posible:
How to resolve a Java Rounding Double issue¿Cómo comparar dos valores dobles en Java?

Una simple comparación de dos valores dobles en Java crea algunos problemas. Consideremos el siguiente fragmento de código simple en 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)); 
    } 
} 

El código anterior parece volver true, la evaluación de la expresión ((a-b)==1.0) pero no es así. Devuelve false en su lugar porque la evaluación de esta expresión es 0.9999999999999999, que en realidad se esperaba que fuera 1.0, que no es igual a 1.0, por lo tanto, la condición se evalúa como booleana false. ¿Cuál es la mejor y más sugerida forma de superar una situación así?

+6

Esto se debe a que los dobles y flotantes no pueden expresar cada valor numérico. Realmente están usando aproximaciones para representar el valor. – onit

Respuesta

53

Básicamente, usted no debe hacer comparaciones exactas, usted debe hacer algo como esto:

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

Es posible que desee echar un vistazo al método de comparación de Double. Consulte este enlace: http://www.tutorialspoint.com/java/lang/double_compare.htm –

+12

Pero si usa Double.compare, tenga en cuenta que (1) Si d1 y d2 representan ambos Double.NaN, entonces el método devuelve verdadero, aunque Double.NaN == Double.NaN tiene el valor falso; y (2) Si d1 representa +0.0 mientras d2 representa -0.0, o viceversa, el método devuelve el valor falso, aunque +0.0 == - 0.0 tiene el valor verdadero. Esta definición permite que las tablas hash funcionen correctamente. – shiggity

8

En lugar de usar dobles para la aritmética decimal, use java.math.BigDecimal. Produciría los resultados esperados.

Como referencia echar un vistazo a este stackoverflow question

+14

BigDecimal a veces no es una solución viable. – mcfinnigan