Il 55 non è in realtà 55. è possibile verificare che facilmente:
<?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;
Resa:
$x == 44: True
$y == 55: False
$y > 55: True
7.105427357601E-15
Come si può vedere la differenza è minuscola (7.1 * 10^-15) ma che comunque lo rende più grande di 55, quindi ceil
lo arrotonda.
La ragione basta vedere 55
è perché eco verrà convertito il galleggiante into a string:
conversione String avviene automaticamente nel campo di applicazione di un'espressione in cui è necessaria una stringa. Questo accade quando si usano le funzioni di eco o di stampa o quando una variabile viene confrontata con una stringa.
Per questa conversione il comportamento di troncamento standard interromperà le cifre ad un certo punto. Questo è configurata dal precision
configuration parameter e il valore predefinito è 14. È possibile evitare questo comportamento utilizzando sprintf
con una precisione personalizzato:
echo sprintf('%.50f', $y);
// 55.00000000000000710542735760100185871124267578125000
Puoi trovare ulteriori informazioni al riguardo: http://php.net/manual/en/function.ceil.php –
@MayurKoshti Non mi sembra come se non lo facesse t capire la funzione. In realtà è piuttosto strano che ciò stia accadendo mentre '50 * ((10/100) + 1)' corrisponde a 55 perfettamente. Non è un galleggiante. Quindi non dovrebbe arrotondare fino a 56 in primo luogo. – icecub
@NikitaKolosov: puoi stampare separatamente il valore di ogni passaggio intermedio e vedere dove potrebbe essere andato storto? – klaar