55 не на самом деле 55. Вы можете проверить, что легко:
<?php
$x = (40 * (10/100 + 1)); // 44
$y = (50 * (10/100 + 1)); // 55
echo '$x == 44: ' . ($x == 44 ? 'True' : 'False') . "\n";
echo '$y == 55: ' . ($y == 55 ? 'True' : 'False') . "\n";
echo '$y > 55: ' . ($y > 55 ? 'True' : 'False') . "\n";
echo $y - 55;
Урожайность:
$x == 44: True
$y == 55: False
$y > 55: True
7.105427357601E-15
Как видите, разница крошечная (7.1 * 10^-15), но она все еще делает ее более 55, поэтому ceil
будет ее обходить.
Причина вы видите только 55
потому, что эхо его будет конвертировать поплавок into a string:
Преобразование строк автоматически сделано в рамках выражения, где требуется строка. Это происходит при использовании функций эха или печати или когда переменная сравнивается со строкой.
Для этого преобразования стандартное поведение усечения в какой-то момент отключит цифры. Это настраивается с помощью precision
configuration parameter и по умолчанию до 14. Вы можете избежать этого с помощью sprintf
с настраиваемой точностью:
echo sprintf('%.50f', $y);
// 55.00000000000000710542735760100185871124267578125000
Вы можете узнать больше об этом: http://php.net/manual/en/function.ceil.php –
@MayurKoshti Мне не кажется, что он не " t понять функцию. На самом деле это довольно странно, так как '50 * ((10/100) + 1)' равно 55 отлично. Это не поплавок. Поэтому он не должен округлять его до 56 в первую очередь. – icecub
@NikitaKolosov: можете ли вы распечатать значение каждого промежуточного шага отдельно и посмотреть, где он мог пойти не так? – klaar