PHP:Ceil函数舍入问题

PHP: Ceil function rounding issue

本问题已经有最佳答案,请猛点这里访问。

在我的WordPress主题函数中,这段代码被用来计算总计费金额:ceil(($cost * (1 + ($charges / 100))) * 100);

下面的场景发生了一些计算错误。

脚本:

1
2
3
4
$charges = 9;
$cost = 100;

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

上面的代码输出10901,而应该是10900

它适用于其他场景,如:

1
2
3
4
5
$charges = 4;
$cost = 90.7;

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

问题:

  • 为什么会这样?
  • 我该怎么预防呢?
  • 有没有其他函数可以四舍五入到下一个最接近的整数?(仅当金额为浮动值时)

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

    1
    2
    3
    4
    $charges = 9;
    $cost = 100;

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

    这将按预期输出10900

    更新

    正如@cars10m所建议的,简化表达式有助于:

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

    更新2

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

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