PHP / 2 浮点数之间的差异返回一个非常大的结果


PHP / difference between 2 float returns a very big result

我在尝试计算结果时有一个奇怪的行为......

在我的应用程序中,我有一个带有属性totalIncludingTax和另一个unpaidAmountInvoice 对象。

结算付款后,将重新计算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