Forum und email

Números de ponto flutuante

Números de ponto flutuante (AKA "floats", "doubles" ou "números reais") podem ser especificados utilizando qualquer uma das sintaxes seguintes:

<?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})
O tamanho de um número de ponto flutuante é dependente de plataforma, sendo o máximo de ~1.8e308 com uma precisão de 14 decimais digitais um valor comum (número de 64 bits no formato IEEE).

Aviso

Precisão de números de ponto flutuante

É sabido que frações simples como 0.1 ou 0.7 não podem ser convertidos em sua representação binária interna sem uma pequena perda de precisão. Isto pode causar erros confusos: por exemplo, floor((0.1+0.7)*10) irá retornar 7 em vez do esperado 8, como resultado da representação interna realmente ser algo como 7.9999999999....

Isto está relacionado ao fato de que é impossível expressar, exatamente, algumas frações em notação decimal com um número finito de dígitos. Por exemplo, 1/3 na forma decimal se torna 0.3333333. . ..

Então, nunca confie em resultados com números de ponto flutuante até a última casa e nunca compare números de ponto flutuante em igualdades. Se você realmente precisar de alta precisão, você pode utilizar as funções matemáticas de precisão arbitrária ou as funções relacionadas ao gmp.

Convertendo para float

Para informações em como e quando strings são convertidas para floats, veja a seção entitulada Conversão de Strings para números. Para valores de outros tipos, a conversão é a mesma se o valor puder ser convertido para inteiro e então para float. Veja a seção Convertendo para inteiro para mais informações. No PHP 5, aviso é emitido se você tentar converter objeto para float.