PHP:Ceil函数舍入问题

时间:2018-07-31 04:41:46

标签: php rounding

在我的wordpress主题功能之一中,此代码用于计算总可结算金额:ceil(($cost * (1 + ($charges / 100))) * 100);

在以下情况下,会发生一些误算。

场景:

$charges = 9;
$cost = 100;

echo ceil(($cost * (1 + ($charges / 100))) * 100);

以上代码输出10901,而应为10900

对于其他情况,它工作正常

$charges = 4;
$cost = 90.7;

echo ceil(($cost * (1 + ($charges / 100))) * 100); 
//outputs 9433, which is fine because manual calculation results 9432.8

问题:

  1. 为什么会这样?
  2. 如何防止这种情况?
  3. 是否有任何替代函数可以舍入到下一个最接近的整数? (仅当金额为浮动值时)

1 个答案:

答案 0 :(得分:2)

问题是您正在将ceil应用于外部表达式。尝试将其重写为:

$charges = 9;
$cost = 100;

echo ($cost + ceil($cost * $charges / 100)) * 100;

这将按预期输出10900

更新

按照@ cars10m的建议,简化表达式确实有帮助:

echo ceil($cost * 100  + $cost * $charges);

更新2

您还可以使用BCMath库进行精确的数学运算:

bcscale(6);
echo ceil(bcadd(bcmul($cost, 100), bcmul($cost, $charges)));