elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  operacion matemática ¿¿?¿?¿?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: operacion matemática ¿¿?¿?¿?  (Leído 2,491 veces)
OssoH


Desconectado Desconectado

Mensajes: 911


Ver Perfil
operacion matemática ¿¿?¿?¿?
« en: 24 Febrero 2021, 09:42 am »

tengo lo siguiente :
$quantity = 237.6;
$m2_palet = 47.52;


echo '<br>=>'.($quantity / $m2_palet);    ===> el resultado es 5 CORRECTO
echo '<br>=>'.floor($quantity / $m2_palet);   ===> el resultado es 4  NO ES CORRECTO
echo '<br>=>'.floor(5); ===> el resultado es 5. CORRECTO

No entiendo porque en el segundo caso no lo calcula correctamente.

Encima si haces lo siguiente :
$resto = fmod($quantity, $m2_palet);   ==> El resultado que da es 47.52 y deberia ser 0

Alguien sabe el motivo? Gracias
No entiendo NADA....¿como debo hacer la operación para que de bien?

Mi version de php es PHP Version 5.6.40. Se que es antigua pero ahora mismo no puedo actualizarla.
Lo acabo de probar en version php PHP Version 7.4.15 y me pasa lo mismo.


« Última modificación: 24 Febrero 2021, 10:09 am por OssoH » En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.850



Ver Perfil WWW
Re: operacion matemática ¿¿?¿?¿?
« Respuesta #1 en: 24 Febrero 2021, 11:07 am »

El problema te surge de la limitación de precisión debido a la representación binaria.

Esencialmente, si tu haces

Código
  1. var_dump($quantity / $m2_palet);

Verás que te devuelve 4.9999999 periódico. Entonces floor obviamente redondea hacia abajo y te saca 4.

https://www.php.net/manual/en/language.types.float.php

Precisión del punto flotante

Citar
Los números de punto flotante tienen una precisión limitada. Aunque depende del sistema, PHP típicamente utiliza el formato de doble precisión IEEE 754, el cual dará un error relativo máximo por aproximación del orden de 1.11e-16. Las operaciones aritméticas elementales no podrán generar grandes errores y, por supuesto, se han de considrar los errores por propagación al componer varias operaciones.

Adicionalmente, los numeros racionales que son representables exactamente como números de punto flotante en base 10, como 0.1 o 0.7, no tienen una representación exacta como números de punto flotante en base 2, que es la base empleada internamente, sin importar el tamaño de la mantisa. Por lo tanto, no se pueden convertir en sus equivalentes binarios internos sin una pequeña pérdida de precisión. Esto puede conducir a resultados confusos: Por ejemplo, floor((0.1+0.7)*10) usualmente devolverá 7 en lugar del 8 previsto, ya que la representación interna será algo así como 7.9999999999999991118....

Por tanto, nunca se ha de confiar en resultados de números flotantes hasta el último dígito, y no comparar la igualdad de números de punto flotante directamente. Si fuera necesaria una mayor precisión, están disponibles las funciones matemáticas de precisión arbitraria y las funciones de gmp.

Para una explicación "simple", véase la » guía del punto flotante que también se titula "¿Por qué no sale la cuenta?"


En tu caso, igual te interesa hacer la division con la libreria BC.

Código
  1. var_dump(floor($quantity / $m2_palet)); // 4
  2. var_dump(floor(bcdiv($quantity, $m2_palet, 3))); // 5

https://www.php.net/manual/es/ref.bc.php
https://www.php.net/manual/es/function.bcdiv.php

Saludos


En línea

OssoH


Desconectado Desconectado

Mensajes: 911


Ver Perfil
Re: operacion matemática ¿¿?¿?¿?
« Respuesta #2 en: 24 Febrero 2021, 11:13 am »

wowwww pedazo explicación!!
Yo estaba pensando para arreglarlo multiplicar por 1000 tanto $quantity y $m2_palet
Y despues hacer el fmod que parece ser que funciona.
« Última modificación: 24 Febrero 2021, 11:19 am por OssoH » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
operación matematica en php. INCREIBLE!!
PHP
OssoH 5 2,276 Último mensaje 16 Septiembre 2015, 09:13 am
por OssoH
Matemática, ¿cómo puedo mejorar velocidad de hacer cuentas ?
Foro Libre
GGZ 4 2,628 Último mensaje 11 Noviembre 2017, 13:44 pm
por PalitroqueZ
Matematica para Machine Learning y Redes Neuronales.
Foro Libre
[u]nsigned 5 3,198 Último mensaje 1 Abril 2018, 21:11 pm
por engel lex
[Resuelto] ¿Qué operación matematica puedo hacer para arreglar esto?
PHP
Leguim 5 2,772 Último mensaje 9 Febrero 2020, 18:15 pm
por Leguim
Leer archivo .txt y hacer operación matemática
Scripting
rafaeljoseyepez 2 2,584 Último mensaje 21 Junio 2020, 20:39 pm
por rafaeljoseyepez
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines