問題

這段程式碼:

 echo (40 * (10 / 100 + 1)); //44
echo (50 * (10 / 100 + 1)); //55
echo ceil(40 * ((10 / 100) + 1)); //44
echo ceil(50 * ((10 / 100) + 1)); //56 (!)
 

我認為,由於浮點的原因,“56”(55.0000000001 => 56),但我不明白為什麼“40”結果是“44”,而不是“45”

  最佳答案

55實際上不是55.你可以很容易地驗證:

 <?php
$x = (40 * (10 / 100 + 1)); // 44
$y = (50 * (10 / 100 + 1)); // 55
echo '$x == 44: ' . ($x == 44 ? 'True' : 'False') . "
";
echo '$y == 55: ' . ($y == 55 ? 'True' : 'False') . "
";
echo '$y > 55: ' . ($y > 55 ? 'True' : 'False') . "
";
echo $y - 55;
 

產量:

 $x == 44: True
$y == 55: False
$y > 55: True
7.105427357601E-15
 

正如您所看到的那樣,差異很小(7.1 * 10 ^ -15),但這仍然使它大於55,所以ceil會圍繞它.

你剛剛看到55的原因是因為響應它將float 轉換為字串:

字串轉換是在需要字串的表示式範圍內自動完成的.當使用echo或print函式時,或者當變數與字串相比較時,會發生這種情況.

對於此轉換,標準截斷行為將在某個時候切斷數字.這由 precision配置引數並預設值為14進行配置.您可以透過使用具有自定義精度的sprintf避免此行為:

 echo sprintf('%.50f', $y);
// 55.00000000000000710542735760100185871124267578125000
 

  相同標籤的其他問題

phpceil