¿Por qué esta resta no es igual a cero?

Encontré estos valores en mi código de ColdFusion, pero la calculadora de Google parece tener el mismo “error” cuando la diferencia no es cero.

416582.2850 – 411476.8100 – 5105.475 = -2.36468622461E-011

http://www.google.com/search?hl=en&rlz=1C1GGLS_enUS340US340&q=416582.2850+-+411476.8100+-+5105.475&aq=f&oq=&aqi=

JavaCasting estos a long / float / double no ayuda, da como resultado otras diferencias distintas de cero.

Esto se debe a que los números decimales que “parecen” redondos en la base 10, no son exactamente representables en la base 2 (que es lo que las computadoras usan para representar números en coma flotante). Consulte el artículo Lo que todo científico informático debería saber sobre la aritmética de punto flotante para obtener una explicación detallada de este problema y las soluciones alternativas.

Inexactitudes de punto flotante (hay un número infinito de números reales y solo un número finito de números de 32 o 64 bits para representarlos).

Si no puede manejar pequeños errores, debe usar BigDecimal en BigDecimal lugar.

Use PrecisionEvaluate() en ColdFusion (usará BigDecimal en Java)

 zero = PrecisionEvaluate(416582.2850 - 411476.8100 - 5105.475); 

a diferencia de Evaulate() , no se necesita “”.

Como la computadora almacena números en binario, los números flotantes son imprecisos. 1E-11 es una pequeña diferencia debido al redondeo de estos números decimales al número binario representable más cercano.

Este “error” no es un error. Así es como funciona la aritmética de coma flotante. Ver: http://docs.sun.com/source/806-3568/ncg_goldberg.html

Si desea precisión arbitraria en Java, use BigDecimal :

  BigDecimal a = new BigDecimal("416582.2850"); BigDecimal b = new BigDecimal("411476.8100"); BigDecimal c = new BigDecimal("5105.475"); System.out.println(a.subtract(b).subtract(c)); // 0.0 

El problema es la representación inexacta de los tipos de coma flotante. Debido a que estos no se pueden representar exactamente como flotantes, se obtiene una pérdida de precisión que hace que las operaciones tengan pequeños errores. Por lo general, con los flotantes que desea comparar si el resultado es igual a otro valor dentro de una pequeña epislon (factor de error).

Estos son problemas de punto flotante y el uso de BigDecimal lo arreglará.

Cambiar el orden de la resta también produce cero en Google.

 416582.2850 - 5105.475 - 411476.8100 = 0