如何在php中处理浮点运算

时间:2017-02-22 15:34:10

标签: php floating-point

我知道浮点错误可能导致精度损失的错误。但我不确定它何时以及如何使用浮点表示。我觉得我的问题最好由以下shell会话代表:

php > $a = 819.94 - 61.67;
php > $b = 758.27;
php > echo $a;
758.27
php > echo $b;
758.27
php > echo $a == $b;
php > echo (string)$a == (string)$b;
1
php > var_dump($a);
double(758.27)
php > var_dump($b);
double(758.27)

这怎么可能?

具体来说,如何确定字符串表示? ==应该是无类型比较。我没有看到比较之前的铸造应该如何改变这些值。

此外,var_dumps显示了相同的值。对于我来说,如果2个var_dumps返回的值相同,那么这两个值应该相等,这似乎是不合理的。

1 个答案:

答案 0 :(得分:2)

两个基本事实:

  • 一个基数中的数字不一定在另一个基数中具有精确表示。

  • 浮点数专门设计为失去精度以实现更广泛的范围。

因此,如果您有一个基本2 IEEE浮点数($b = 758.27),并且您想将其转换为有限基数10表示((string)$b),那么很明显,您必须实施一些规则。

在PHP中,其中一条规则是只显示最多precision个数字:

  

precision integer       浮点数中显示的有效位数。 -1表示用于舍入此类数字的增强算法   将被使用。

var_dump(ini_get('precision'), 758.27, 819.94 - 61.67);
ini_set('precision', 20);
var_dump(ini_get('precision'), 758.27, 819.94 - 61.67);
string(2) "14"
float(758.27)
float(758.27)
string(2) "20"
float(758.26999999999998181)
float(758.2700000000000955)