¿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í?
¿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í?
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.
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
errores de redondeo en los puntos flotantes
misma manera que 3 * 0.1 != 0.3
(cuando no está doblado por el compilador al menos)
promoción de tipo automático está ocurriendo y que es el resultado.
Aquí hay algunos recursos para aprender.
http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html
El siguiente paso sería es aprender a utilizar formateadores para dar formato a los requisitos dados de precisión /.
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
flotante aritmética de punto es lo que está pasando. –
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?) –
Esta tiene que ser la pregunta de programación más común. .... –