我有两个看起来在PHP中相等的double值(至少在回显它们时)。奇数行为比较双倍,两个PHP双值不等价
但是,当将它们与double等值进行比较时,出于某种原因,它的计算结果为false。进行这种比较时有没有特别的考虑?
我有两个看起来在PHP中相等的double值(至少在回显它们时)。奇数行为比较双倍,两个PHP双值不等价
但是,当将它们与double等值进行比较时,出于某种原因,它的计算结果为false。进行这种比较时有没有特别的考虑?
你不应该不使用==
运算符比较浮点数。
看到大警告,explanation in the php manual
什么工作是断言,这两个数字都是这样对方的某个小范围内:
if(abs($a - $b) < 0.0001) {
print("a is mostly equal to b");
}
的原因是因为四舍五入,由于错误的到小数点后执行的浮点算术转换为二进制,然后转换回十进制。这些来回转换会导致0.1 + 0.2
不等于0.3
的现象。
float和double应该永远不会相互比较:即使它们看起来相等(当它们被打印出来,它们通常是圆形的),也会有两个数字不同的精度错误。
正确的方法是使用一些DELTA常数进行比较:
define(DELTA, 0.00001); // Or whatever precision you require
if (abs($a-$b) < DELTA) {
// ...
}
另外请注意,这不是PHP具体,但在其他语言中也很重要(Java,C,...)
浮点数在PHP中的表示(as well as in C and many other languages)是不精确的。由于这个事实,看似相同的数字实际上可能不同,并且比较将失败。相反,选择一些小的数目,并检查差值小于,像:
if(abs($a-$b)<0.00001) {
echo "Equal!";
}
你可以发布你使用的代码和那些双打吗? – Furicane 2011-03-11 09:22:40