Los números de punto flotante (también conocidos como "flotantes", "dobles" o "números reales") pueden ser especificados usando cualquiera de las siguientes sintaxis:
<?php
$a = 1.234;
$b = 1.2e3;
$c = 7E-10;
?>
Formalmente:
LNUM [0-9]+ DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*) EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM})
El tamaño de un flotante depende de la plataforma, aunque un valor común consiste en un máximo de ~1.8e308 con una precisión de aproximadamente 14 dígitos decimales (lo que es un valor de 64 bits en formato IEEE).
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 dar grandes errores y por supuesto, los errores por propagación deben ser considerados cuando varias operaciones son compuestas.
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, el cual es usado internamente, sin importar el tamaño de la mantisa. Por lo tanto, no se puede convertir en sus contrapartes binarias internas sin una pequeña pérdida de precisión. Esto puede llevar a confundir resultados: Por ejemplo, floor((0.1+0.7)*10) usualmente retornará 7 en lugar del 8 esperado, ya que la representación interna será algo así como 7.9999999999999991118....
Así que nunca se confía en resultados de números flotantes hasta el último dígito y no se comparan números de punto flotante directamente para igualdad. Si es necesaria una mejor precisión, están disponibles las funciones matemáticas de precisión arbitraria y las funciones gmp.
Para una explicación "simple", véase la » guía de punto flotante que también se titula "¿Por qué no suman mis números?"
Para más información sobre las conversiones de string a float, vea Conversión de cadenas a números. Para valores de otros tipos, la conversión es la misma que si el valor hubiese sido convertido a integer y luego a float. Vea Conversión a entero para más información. A partir de PHP 5, una noticia es generada si intenta convertir un objeto a float.
Como se indica en la advertencia anterior, comprobar la igualdad de valores de punto flotante es problemático, debido a la forma en que se representan internamente. Sin embargo, hay maneras de hacer comparaciones de los valores de punto flotante que trabajan rodeando a estas limitaciones.
Para comprobar la igualdad de valores de punto flotante, se utiliza un límite superior en el error relativo debido al redondeo. Este valor se conoce como el epsilon de la máquina o unidad de redondeo y es la menor diferencia 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";
}
?>
Algunas operaciones numéricas pueden resultar en un valor representado por la constante
NAN
. Este resultado representa un valor no definido o
no representable mediante cálculos de coma flotante. Cualquier comparación, ya sea poco
rígida o estricta, de esta valor con cualquier otro valor, incluido él mismo
tenfrá un resultado de FALSE
.
Ya que NAN
representa cualquier número de diferentes valores,
NAN
no debería compararse con otros valores, incluido
él mismo; en su lugar debería comprobarse usando la función is_nan().