尝试计算结果时,我有一种奇怪的行为......
在我的应用中,我有一个Invoice
对象,其中包含属性totalIncludingTax
和另一个unpaidAmount
。
付款结算后,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));
有什么想法吗?
修改
此断言也返回true
$this->assertEquals(0, ($invoice->getTotalIncludingTax() - 14.35));
答案 0 :(得分:1)
1.7763568394003E-15
不是一个很大的数字,它实际上非常小。它以科学记数法显示;它的正常形式为0.0000000000000017763568394003。这是浮点表示引起的错误。
PHP manual表示你应该比较浮点数:
测试浮点值是否相等,是否为上限 使用由于舍入引起的相对误差。这个值被称为 机器epsilon,或单位舍入,是最小的可接受的 计算差异。
$a
和$b
等于5位精度。
<?php
$a = 1.23456789;
$b = 1.23456780;
$epsilon = 0.00001;
if(abs($a-$b) < $epsilon) {
echo "true";
}
?>
也许assertEquals
做了类似的事情
答案 1 :(得分:0)
我总是喜欢用bcmath进行计算/比较,比例为4,然后用2或0的比例进行舍入。