php intval () e floor () retornam valor muito baixo?
Como o tipo de dados flutuantes no PHP é impreciso e um FLOAT no MySQL ocupa mais espaço que um INT (e é impreciso), eu sempre armazeno preços como INTs, multiplicando por 100 antes de armazenar para garantir que tenhamos exatamente 2 casas decimais de precisão. No entanto, acredito que o PHP está se comportando mal. Código de exemplo:
echo "<pre>";
$price = "1.15";
echo "Price = ";
var_dump($price);
$price_corrected = $price*100;
echo "Corrected price = ";
var_dump($price_corrected);
$price_int = intval(floor($price_corrected));
echo "Integer price = ";
var_dump($price_int);
echo "</pre>";
Saída produzida:
Price = string(4) "1.15"
Corrected price = float(115)
Integer price = int(114)
Eu estava surpreso. Quando o resultado final foi menor que o esperado em 1, eu esperava que a saída do meu teste parecesse mais com:
Price = string(4) "1.15"
Corrected price = float(114.999999999)
Integer price = int(114)
que demonstraria a imprecisão do tipo de flutuação. Mas por que o piso (115) está retornando 114