在我的申请中,我有一个与财务余额修改相关的程序,因此,它包含在一个交易中。
操作结束,就在提交交易之前,我进行了一次小检查 - 确保平衡得到了正确修改。
public function setBalance($amount) {
// ......
// Updating balance code, nothing worst attention
// ......
$balance = $this->getBalance(false);
if ($amount != $balance) {
throw new Exception('Error updating balance! ' . $balance . " instead of " . $amount);
}
这个简单的代码抛出异常。它说386.57不等于386.57。真。
我尝试使用我最喜欢的var_dump
和die
检查区别。
var_dump($balance - $amount);
die();
输出更加精彩:
float(-2.8421709430404E-13)
$balance
和$amount
这两个数字都是float
。
有人可以解释这种奇怪的行为吗?为什么会这样?有错吗?
答案 0 :(得分:2)
使用浮动时这是正常的。尝试使用此代码:
if (abs($amount-$balance) > 0.001) {
throw new Exception('Error updating balance! ' . $balance . " instead of " . $amount);
}
如果你被这个抓住了,请记得正确地绕圈。这并不容易。什么时候圆,以及如何圆,是由很多人做的不同。请注意,PHP round()
函数现在允许您选择舍入类型。像这样:
round($Value,2,PHP_ROUND_HALF_EVEN);