Test 9
Este test es cortesía de Diego Madina.
Utilizando una distribución de MySQL 5.0 bastante reciente, vemos que…
mysql> SELECT 1.1E0, 2.2E0, 3.3E0;
+-------+-------+-------+
| 1.1E0 | 2.2E0 | 3.3E0 |
+-------+-------+-------+
| 1.1 | 2.2 | 3.3 |
+-------+-------+-------+
1 row in set (0.00 sec)and…
mysql> select 1.1+2.2=3.3;
+-------------+
| 1.1+2.2=3.3 |
+-------------+
| 1 |
+-------------+
1 row in set (0.00 sec)But…
mysql> select 1.1E0+2.2E0=3.3E0;
+-------------------+
| 1.1E0+2.2E0=3.3E0 |
+-------------------+
| 0 |
+-------------------+
1 row in set (0.00 sec)
¿ Por qué sucede esto ?
Pulsa para Mostrar/Ocultar la solución
Respuesta: En las versiones de MySQL anteriores a la 5.0.3, cualquier número que no pareciese a primera vista un entero, se convertía a coma flotante antes de hacer ningún cálculo. Desde la 5.0.3, los números con decimales exactos (como «1.1» o «2.2») se tratan como números DECIMAL y se utiliza una nueva libreria de precisión matemática para realizar los cálculos matemáticos. Números como «1.1E0» no se consideran de decimales exactos, y los cálculos sobre dichos números se realizan utilizando rutinas de coma flotante. Los cálculos de coma flotante tienen por definición un número de errores de redondeo, por lo que 1.1+2.2 no es igual a 3.3 (sino a algo similar a 3.3000000715256) cuando este cáculo se realiza usando rutinas estandard de coma flotante. En casi todo el hardware fabricado desde 1980, la gestión de números con coma flotante se realiza según el estandard IEEE 754. Puedes obtener más información sobre esto en la Wikipedia, pero si tienes ocasión dale un vistazo al Apéndice B del libro Structured Computer Organization de Andrew Tannenbaum (sólo en inglés).
Traducido con permiso expreso de Mysql Test Quiz 9 Original
Creado por Carsten H. Pedersen
Otros Test anteriores: