我在尝试计算结果时有一个奇怪的行为......
在我的应用程序中,我有一个带有属性totalIncludingTax
和另一个unpaidAmount
的 Invoice
对象。
结算付款后,将重新计算unpaidAmount
属性。
考虑一张总含税金额为 14.35
的发票
这将返回returns double(14.35)
$invoice->getTotalIncludingTax()
此断言返回 true
$this->assertEquals($invoice->getUnpaidAmount(), ($invoice->getTotalIncludingTax() - 14.35));
但是此转储返回double(1.7763568394003E-15)
var_dump(($invoice->getTotalIncludingTax() - 14.35));
知道吗?
编辑
这个断言也返回为真
$this->assertEquals(0, ($invoice->getTotalIncludingTax() - 14.35));
1.7763568394003E-15
不是一个大数字,它实际上非常非常小。它以科学记数法显示;正常形式为 0.0000000000000017763568394003。这是由于浮点表示引起的错误。
PHP 手册指出您应该这样比较浮点数:
若要测试浮点值的相等性,上限为 使用由于舍入引起的相对误差。此值称为 机器 epsilon 或单位舍入,是可接受的最小值 计算差异。
$a
和$b
等于 5 位精度。
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
也许assertEquals
做了类似的事情
我总是更喜欢在 bcmath 中以 4 的比例进行计算/比较,然后以 2 或 0 的比例对其进行四舍五入。
检查 http://php.net/manual/en/book.bc.php