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

时间:2016-02-10 15:22:54

标签: php

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

在我的应用中,我有一个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));

2 个答案:

答案 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的比例进行舍入。

检查http://php.net/manual/en/book.bc.php