2011-11-11 18 views
5

¿Es esto un problema en Java?Java Glitch? ¿Restar números?

voy a resolver esta expresión: 03.01 a 07.01

tengo la respuesta: -3.9999999999999996

lo que está pasando aquí?

+15

flotante aritmética de punto es lo que está pasando. –

+0

Ver cosas como [esto] (http://stackoverflow.com/questions/2798830/double-precision-values) y un montón de otros. (Oye, ¿a dónde va el artículo de WECSSKAFPN?) –

+2

Esta tiene que ser la pregunta de programación más común. .... –

Respuesta

10

Una gran explicación se puede encontrar aquí. http://www.ibm.com/developerworks/java/library/j-jtp0114/

La aritmética de punto flotante raramente es exacta. Mientras que algunos números, como como 0.5, se pueden representar exactamente como un decimal binario (base 2) (ya que 0.5 es igual a 2-1), otros números, como 0.1, no pueden ser. Como resultado, las operaciones de punto flotante pueden provocar errores de redondeo, lo que arroja un resultado de que es cercano, pero no igual, al resultado que podría esperar . Por ejemplo, el simple cálculo debajo de los resultados en 2.600000000000001, en lugar de 2,6:

double s=0; 

for (int i=0; i<26; i++) 
    s += 0.1; 
System.out.println(s); 

Del mismo modo, la multiplicación de 0,1 * 26 produce un resultado diferente de la de la adición de 0,1 a sí mismo 26 veces. Los errores de redondeo se vuelven aún más graves al convertir de coma flotante a entero, porque el fundido a un tipo integral descarta la parte no integral, incluso para los cálculos que "parecen" que deberían tener valores integrales. Por ejemplo, las siguientes afirmaciones:

double d = 29.0 * 0.01; 
    System.out.println(d); 
    System.out.println((int) (d * 100)); 

se producen como salida:

0.29 
    28 

que probablemente no es lo que cabría esperar en un principio.

Consulte la referencia proporcionada para obtener más información.

1

Las computadoras son 100% así que en el mundo de las matemáticas es correcto, para la persona promedio no lo es. Java no puede tener un error en un número específico, ya que es solo código que se ejecuta de la misma manera pero tiene una entrada diferente.

P.S. Google cómo redondear un número

+0

Gracias hombre. Esto es realmente extraño ... – Confiqure

+0

'Java no puede tener un error' ?? Nunca me encontré con un sistema informático que no tenía un error ... –

+0

No, quiero decir en una simple adición, es como decir que 5 + 5 será correcto 6 + 5, – Hego555

1

errores de redondeo en los puntos flotantes

misma manera que 3 * 0.1 != 0.3 (cuando no está doblado por el compilador al menos)

2

Según lo mencionado por varios otros, no puede contar con double si desea obtener un valor decimal exacto, p. Ej. al implementar aplicaciones monetarias.Lo que debe hacer en su lugar es para echar un vistazo más de cerca a BigDecimal:

BigDecimal a = new BigDecimal("3.1"); 
BigDecimal b = new BigDecimal("7.1"); 
BigDecimal result = a.subtract(b); 
System.out.println(result);  // Prints -4.0