问题

这段代码:

 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