Поскольку тип данных float в PHP неточен, а FLOAT в MySQL занимает больше места, чем INT (и является неточным), я всегда храню цены как INT, умножая на 100 до хранения, чтобы обеспечить ровно 2 десятичных знака местами точности. Однако я считаю, что PHP не прав. Пример кода:
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>";
Произведенный выход:
Price = string(4) "1.15"
Corrected price = float(115)
Integer price = int(114)
Я был удивлен. Когда конечный результат был ниже ожидаемого на 1, я ожидал, что результат моего теста будет больше похож:
Price = string(4) "1.15"
Corrected price = float(114.999999999)
Integer price = int(114)
который продемонстрировал бы неточность типа float. Но почему слово (115) возвращается 114?