Pregunta:
Fecha: 20-06-2015 07:28:10
(En Español)
Muchas gracias por sus aportes
Saludos,
Votos: 1 - Respuestas: 6 - Vistas: 24 Compartir en: Google Facebook Twitter LinkedIn Link
Misterio: ¿Por qué el resultado de una resta de números "float" en PHP no es precisa?[Resuelta]
El resultado debería ser 0.82 , pero el calculo arroja 0.81999999999994, por qué?<?php $float1 = 1095.82; $float2 = 1095.00; echo $float1 - $float2; ?>
Muchas gracias por sus aportes
Saludos,
Votos: 1 - Respuestas: 6 - Vistas: 24 Compartir en: Google Facebook Twitter LinkedIn Link
Respuestas:
-
Fecha: 20-06-2015 08:12:51 Fernando:
Buenas tardes, e verificado tu calculo y llego a esta humilde conclusión (Lejos de ser la correcta, pero es mi opinión personal al respecto) ...
1095.82 - 1095 = 0.82 si solamente el calculo lo hacemos con 2 decimales ... proba en una planilla Excel o hace un eje cartesiano, veras que el resultado tiende a 0.82 pero el resultado real es 0.8199999999999360000, te digo lo del eje cartesiano, ya que el resultado es un punto que tiende a infinito.
De allí que te explicaba en el POST del FACE que debes redondear ....
En este caso el resultado si se pretende obtener 0.82
Te mando un cordial saludo Votos: 0 - Link respuesta -
Fecha: 20-06-2015 08:24:56 Hola Daniel, ante todo gracias por responder, pero no estoy de acuerdo, si estoy haciendo una simple resta, 1095,82 - 1095, matematicamente deberia dar 0,82
Para que el resultado sea el que arroja PHP, el calculo matemático deberia ser:
1095,82 - 1095,00000000000006
Solo en este caso tendría sentido el resultado: 0,81999999999994
Espero que alguien pueda aportar claridad a este asunto...
Saludos, Votos: 0 - Link respuesta -
Fecha: 20-06-2015 09:15:50 Fernando.
Php como Mysql o Excel ... te da el resultado mas aproximado, vos no trabajas con numeros enteros, sino con decimales, de hecho todo cuentan con funcionas para redondear los decimales a tu necesidad.
Insisto con el eje cartesiano, verifica la parabola del resultado Votos: 0 - Link respuesta -
Fecha: 20-06-2015 09:19:32 Encontre una espectacular respuesta en stackoverflow, aqui la traducción según google translate (se entiende muy bien):
Si todavía alguien llegar a esta persona con problemas similares en los que el número de sustracción flotante hace que los valores de error o extraños. Quiero explicar este problema con un poco más detalles.
No está directamente relacionado con PHP y no es un error. Sin embargo, todos los programadores deben ser conscientes de este problema.
Este problema incluso tomó muchas vidas hace dos décadas.
El 25 de febrero 1991 este problema en el cálculo de número flotando en una batería de misiles Patriot MIM-104 lo impidió interceptar un misil Scud en Dhahran, Arabia Saudita, lo que contribuye a la muerte de 28 soldados del 14 de Intendencia Destacamento del Ejército de Estados Unidos.
Pero por qué sucede?
La razón es que los valores de coma flotante representan una precisión limitada. Por lo tanto, un valor no podría tener la misma representación de cadena después de cualquier tratamiento. También incluye la redacción de un valor de punto flotante en su guión y la impresión directa sin ningún tipo de operaciones matemáticas.
Sólo un ejemplo sencillo:
$ '36' a =;
$ B = '-35,99';
echo ($ a + $ b);
Uno esperaría que imprima 0.01, ¿verdad? Pero va a imprimir una respuesta muy extraña como ,009999999999998
Al igual que otros números, números de punto flotante doble o flotante se almacena en la memoria como una serie de 0 y de 1 de. ¿Cómo se diferencia de punto flotante entero está en cómo interpretamos el 0 del y de cuando queremos mirarlos 1. Hay muchas normas como están almacenados.
Números de coma flotante son típicamente empaquetan en un dato equipo que el bit de signo, el campo exponente y la mantisa o mantisa, de izquierda a derecha ....
Los números decimales no están bien representados en binario, debido a la falta de espacio suficiente. Por lo tanto, no se puede expresar uou tercera exactamente como es 0,3333333 ..., ¿no? ¿Por qué no podemos representamos 0.01 como un número flotante binario es por la misma razón. 1/100 es ,00000010100011110101110000 ..... con una repetición 10100011110101110000.
Si 0.01 se mantiene en forma simplificada y truncada por el sistema de 01000111101011100001010 en binario, cuando se traduce de nuevo a decimal, que se lee como 0,0099999 .... dependiendo del sistema (ordenadores de 64 bits le dará mucho mejor precisión de 32 bits ). Sistema operativo decide en este caso si se imprime como se ve o cómo hacerlo en forma más legible. Por lo tanto, es dependiente de la máquina cómo quieren representarlo. Pero puede estar protegida en el nivel de idioma con diferentes métodos.
Si formatea el resultado, number_format eco (,009999999999998, 2); se imprimirá 0.01.
Es porque en este caso se indique cómo se debe leer y cómo la precisión que usted requiere.
Fuente: http://stackoverflow.com/questions/17210787/php-float-calculation-error-when-subtracting Votos: 1 - Link respuesta -
Fecha: 20-06-2015 09:29:06 Esto es por la manera en que las computadoras funcionan. Todos los valores, como bien sabemos, se convierten a binario. Para números enteros la relación es exacta, el problema se presenta con números con fracción decimal. No todas las fracciones pueden convertirse a un número binario exacto.
A qué me refiero con esto?
Mira los siguientes ejemplos de valores decimales y sus equivalencias en binario:
0.5 - 0.1
0.25 - 0.01
Los valores corresponden a cifras exactas en binario pero ahora mira estos ejemplos:
0.3 - .01[0011]*
0.82 - .110100111000010....
*La parte entre corchetes es periódica
Al no tener representación exacta las operaciones con punto flotante podrán llevar un máximo error relativo que se irá acumulando y dependiendo de lo que se haga puede representar un error significativo.
Cuando se trabaja con números con parte decimal lo más sencillo es redondear o utilizar las funciones adecuadas como las de BC Math como bcadd, etc. Hay formas más complicadas pero con esas dos siempre me ha ido bien. Votos: 2 - Link respuesta -
Fecha: 31-07-2015 18:09:06 Todo es por la forma de representación de los números flotantes, todos sabemos que los números se representan en binario en las computadoras. El estándar IEEE 754 da los siguientes lineamientos:
Para precisión de 32 bits:
1 bit de signo, 8 bits de exponente y 23 bits de mantisa
Para precisión de 64 bits:
1 bit de signo, 11 bits de exponente y 52 bits de mantisa
Es por esto que la precisión es limitada, y de hecho arquitecturas de 64 bits son el doble de precisas.
Hay una fórmula para calcular el porcentaje de error pero no la recuerdo este momento.
Les comparto este enlace http://www.h-schmidt.net/FloatConverter/IEEE754.html, si introducen 1095.82 verán el grado de precisión de los datos.
Estos temas son bastante interesantes, les recomiendo leer libros de arquitectura de computadores, hay capítulos enteros acerca de representación de la información. Saludos! Votos: 0 - Link respuesta
Para participar activamente de la comunidad primero debes autenticarte, ingresa al sistema.Iniciar Sesión
