Números Coma Flotante

Los números de coma flotante (también conocidos como “flotantes”, “dobles” o “números reales”) se pueden especificar utilizando cualquiera de las siguientes sintaxis:

<?php
$a = 1.234; 
$b = 1.2e3; 
$c = 7E-10;
$d = 1_234.567; // as of PHP 7.4.0
?>

Formalmente a partir de PHP 7.4.0 (anteriormente, no se permitían guiones bajos):

LNUM [0-9] + (_ [0-9] +) *
DNUM ([0-9] * (_ [0-9] +) * [\.] {LNUM}) | ({LNUM} [\.] [0-9] * (_ [0-9] +) *)
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE] [+ -]? {LNUM})

El tamaño de un flotante depende de la plataforma, aunque un máximo de aproximadamente 1.8e308 con una precisión de aproximadamente 14 dígitos decimales es un valor común (el formato IEEE de 64 bits).

Advertencia

Precisión de punto flotante

Los números de coma flotante tienen precisión limitada. Aunque depende del sistema, PHP generalmente usa el formato de precisión doble IEEE 754, que dará un error relativo máximo debido al redondeo en el orden de 1.11e-16. Las operaciones aritméticas no elementales pueden dar errores más grandes y, por supuesto, la propagación de errores debe considerarse cuando se combinan varias operaciones.

Además, los números racionales que son exactamente representables como números de coma flotante en la base 10, como 0.1 o 0.7 , no tienen una representación exacta como números de coma flotante en la base 2, que se usa internamente, sin importar el tamaño de la mantisa. Por lo tanto, no pueden convertirse en sus equivalentes binarios internos sin una pequeña pérdida de precisión. Esto puede llevar a confundir los resultados: por ejemplo, floor ((0,1 + 0,7) * 10) usualmente devolverá 7 en lugar del esperado 8 , ya que la representación interna será algo así como 7,9999999999999991118 … .

Por lo tanto, nunca confíe en los resultados de números flotantes al último dígito, y no compare los números de coma flotante directamente para la igualdad. Si es necesaria una mayor precisión, las funciones matemáticas de precisión arbitraria y las funciones gmp están disponibles.

Para obtener una explicación “simple”, consulte la »guía de coma flotante que también se titula” ¿Por qué no se suman mis números? “

Convertir a flotante 

Para obtener información sobre cómo convertir cadenas s en flotantes , consulte Conversión de cadenas a números . Para valores de otros tipos, la conversión se realiza convirtiendo el valor a entero primero y luego a flotante . Vea Convertir a entero para más información. A partir de PHP 5, se emite un aviso si un objeto se convierte en flotante .

Comparando flotadores 

Como se señaló en la advertencia anterior, probar los valores de coma flotante para la igualdad es problemático, debido a la forma en que se representan internamente. Sin embargo, hay formas de hacer comparaciones de valores de coma flotante que evitan estas limitaciones.

Para probar la igualdad de los valores de coma flotante, se utiliza un límite superior en el error relativo debido al redondeo. Este valor se conoce como épsilon de la máquina, o redondeo unitario, y es la diferencia más pequeña aceptable en los cálculos.

$ a y $ b son iguales a 5 dígitos de precisión.

<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;

if(abs($a-$b) < $epsilon) {
    echo "true";
}
?>

NaN 

Algunas operaciones numéricas pueden dar como resultado un valor representado por la constante NAN. Este resultado representa un valor indefinido o no representable en los cálculos de punto flotante. Cualquier comparación suelta o estricta de este valor con cualquier otro valor, incluido él mismo, pero excepto TRUE, tendrá un resultado de FALSE.

Debido a que NANrepresenta cualquier número de valores diferentes, NANno debe compararse con otros valores, incluido él mismo, y en su lugar debe verificarse para usar is_nan () .