2011-09-14 64 views
27

¿Por qué las operaciones matemáticas en ColdFusion no parecen verse afectadas por problemas matemáticos de coma flotante? Tome el código:¿Por qué 0.06 + 0.01 = 0.07 en ColdFusion?

result = 0.06 + 0.01; 

writedump(result); 
writedump(result.getClass().getName()); 

que da salida a

0,07

java.lang.Double

Sin embargo, el código Java equivlant lo que produce "d espera al añadir dos dobles :

public static void main(String[] args) { 
    double a = 0.01d; 
    double b = 0.06d; 

    System.out.println(a + b); //0.06999999999999999 
} 

Esto es lo que esperaría ver de ColdFusion debido a las realidades de las matemáticas flotantes (http://download.oracle.com/docs/cd/E19957-01/806-3568/ncg_goldberg.html).

¿ColdFusion hace algo de "magia" detrás de escena o estoy viendo una anomalía aislada aquí?

+0

Todo lo que google dice no tiene nada de especial y produce los resultados que espera (y la gente pregunta por qué, porque no entienden la precisión del punto flotante). ¿Estás seguro de que no ocurre nada más en tu código CF? –

+0

Sí, ese fragmento es eso. Acabo de crear los escenarios más simples para ver qué pasaría. Lo que es extraño es si tomo ese código un paso más allá y hago 'a = 0.01; b = 0.06; writedump (a.getClass(). getName(); 'Obtengo un String. Definitivamente hay alguna conversión implícita ocurriendo detrás de escena. – bittersweetryan

+2

CF almacena la mayoría de los valores como cadenas inicialmente. Solo los convierte a otros tipos (número, fecha, etcétera) según sea necesario. Por ejemplo, cuando se aplica un operador matemático como '+'. http://help.adobe.com/en_US/ColdFusion/9.0/Developing/WSc3ff6d0ea77859461172e0811cbec09af4-7fc3.html – Leigh

Respuesta

35

Sospecho que está simplemente redondeando de manera diferente en la salida . En otras palabras, el problema sigue ahí: sucede que no se muestra cuando se imprime este valor en particular con writedump.

¿Qué ocurre si se utiliza:

writedump(String.valueOf(result)); 

?

+0

Eso es, el valor de la cadena de volcado muestra .69999999999999; – bittersweetryan

+3

'writedump' y' cfdump' hacen un montón de formateo - esto hace que ver rápidamente objetos complejos sea muy fácil pero parece también introduce cierta ambigüedad en casos como este. – Antony

+0

@Antony - Sí. Aprendí que no confío en él implícitamente, ya que está diseñado para favorecer la legibilidad en lugar de la precisión en muchos casos;) – Leigh

Cuestiones relacionadas