2011-03-11 77 views
4

我有两个看起来在PHP中相等的double值(至少在回显它们时)。奇数行为比较双倍,两个PHP双值不等价

但是,当将它们与double等值进行比较时,出于某种原因,它的计算结果为false。进行这种比较时有没有特别的考虑?

+0

你可以发布你使用的代码和那些双打吗? – Furicane 2011-03-11 09:22:40

回答

9

你不应该不使用==运算符比较浮点数。

看到大警告,explanation in the php manual

什么工作是断言,这两个数字都是这样对方的某个小范围内:

if(abs($a - $b) < 0.0001) { 
    print("a is mostly equal to b"); 
} 

的原因是因为四舍五入,由于错误的到小数点后执行的浮点算术转换为二进制,然后转换回十进制。这些来回转换会导致0.1 + 0.2不等于0.3的现象。

0

float和double应该永远不会相互比较:即使它们看起来相等(当它们被打印出来,它们通常是圆形的),也会有两个数字不同的精度错误。

正确的方法是使用一些DELTA常数进行比较:

define(DELTA, 0.00001); // Or whatever precision you require 

if (abs($a-$b) < DELTA) { 
    // ... 
} 

另外请注意,这不是PHP具体,但在其他语言中也很重要(Java,C,...)