我知道浮点错误可能导致精度损失的错误。但我不确定它何时以及如何使用浮点表示。我觉得我的问题最好由以下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返回的值相同,那么这两个值应该相等,这似乎是不合理的。
答案 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)