Все коллеги, ответившие выше, правы.
float заразен. Всё, чего он касается в математических выражениях, превращается во
float.
Я лишь хотел посоветовать эдакий костыльный подход, который позволит вам не так сильно напрягаться, вспоминая, как же эти динамические языки приводят одно к другому.
Чем больше программисту надо держать в голове подобных правил динамических языков, тем больше в программе багов. Поэтому строгая типизация - это большое добро, ведь она минусует целый класс багов.
На наше счастье в
PHP завезли хоть какую-то типизацию. К сожалению, на данный момент она касается только аргументов и возвращаемых значений функций, а так же свойств и методов классов. Явно типизировать обычную переменную не получится.
Попробуем использовать хотя бы то, что нам дали. Для этого будем придерживаться простого правила:
все вычисления всегда выносить в отдельные функции, а эти функции всегда типизировать по-максимуму.
Видим деление, умножение и т.д. - выносим это выражение в функцию. Это, конечно, не идеальное решение, но оно избавит нас хотя бы от какого-то количества проблем. Если в вашем случае вынести код в функцию, то результат не только будет целым числом, но PHP ещё и сообщение DEPRECATED нам выдаст.
<?php
$sum = 400;
// Было
$all = $sum * (55 / 100);
var_dump($all); // На выходе float(220.00000000000003)
// Стало
$all2 = calculateAll($sum);
var_dump($all2); // На выходе int(220)
function calculateAll(int $sum): int
{
return $sum * (55 / 100);
}
Вывод
float(220.00000000000003)
PHP Deprecated: Implicit conversion from float 220.00000000000003 to int loses precision in /Users/vitiok78/Downloads/float.php on line 12
Deprecated: Implicit conversion from float 220.00000000000003 to int loses precision in /Users/vitiok78/Downloads/float.php on line 12
int(220)