关于php:当-11.5加11.5等于浮点数(2.8421709430404E-14)


When -11.5 plus 11.5 equals float(2.8421709430404E-14)

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
PHP Math Precision
Best practice for working with currency values in PHP?

我真的希望有人能帮忙。我的头撞在这面砖墙上了。

情况如下:我有一个结帐处,计算出折扣后的小计为11.50英镑。再加上11.50英镑的运费,IMHO应等于0英镑。

但是,当运行计算时,它返回一个浮动2.8421709430404E-14

在我的调试工作中,我做到了:

1
2
3
4
5
var_dump(
    $build['total'], // float(-11.5)
    $build['delivery'], // float(11.5)
    (($build['total'])+($build['delivery'])) // float(2.8421709430404E-14)
);

但是,当我进行静态计算时:

1
var_dump((-11.5 + 11.5)); // float(0)

有什么想法吗?


2.8421709430404E-14最接近(但不等于)PHP可以输出的零号。它不完全是0的原因在于浮点数的定义——它们从来都不是完全精确的。

如果您需要处理也包含小数点的敏感信息,我建议您将其乘为整数。

所以100.54美元变成了10054美元。在所有的计算完成之后,你就可以把它除以分数。

例子:

1
2
3
4
5
6
7
8
9
$build['total'] = -11.5;
$build['delivery'] = 11.5;

var_dump(
    $build['total'], // float(-11.5)
    $build['delivery'], // float(11.5)
    (int)($build['total']*1000)+(int)($build['delivery']*1000) // int(0)
    (int)(round($build['total'], 4)*1000)+(int)(round($build['delivery'], 4)*1000) // int(0)
);