【发布时间】:2019-01-07 09:19:49
【问题描述】:
在我的一个 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
问题:
- 为什么会这样?
- 如何防止这种情况发生?
- 有任何替代函数可以舍入到下一个最接近的整数吗? (仅当金额为浮点值时)
【问题讨论】:
-
@Phil 这些答案都没有帮助,首先,这不是数学问题。其次,它几乎可以正常工作,但仅对以 00 结尾的特定数字导致错误。请取消标记问题或分享有用的资源。谢谢
-
看来您确实正在面临由数值准确性引起的问题。虽然我发现简化您的方程式确实有帮助:
ceil($cost*(100+$charge));,请参阅此处:rextester.com/QQEYOS31143 -
感谢@cars10m,还有另一个问题。您的方程式在 rextester.com 上运行良好,但在我的服务器上,它有同样的问题。 :( 我正在运行 5.6.32
-
@Alena 它肯定是一个浮点算术问题。例如,
100 * (1 + (9 / 100))显示为109.00000000000001。这就是为什么ceil()似乎正在四舍五入。请阅读我在您的问题顶部链接的两个帖子 -
在使用
ceil()函数之前,您可以尝试使用round($cost*(100+$charge),6)舍入到小数点后 6 位最接近的数字。但是,据报道round()在某些情况下是错误的。否则,您也可以通过创建一个圆角字符串来绕道,例如sprintf('%0.6f',$cost*(100+$charge)),然后继续对其进行数学运算(它将隐式转换回浮点数)。在这两种情况下,ceil()函数将在之后应用以将值转换为“下一个更大的整数”。