漂浮物的问题! (在PHP中)

时间:2010-11-25 11:30:12

标签: php floating-point

php浮动有什么问题?

$v = 5.2 * 3;

if($v==15.6) {
    echo 'Everything is fine =)';
} else {
    echo 'Okay something is wrong :S';
    var_dump($v); // float 15.6
}

检查一下:

$v = 5.2 * 3;

if($v>15.6 AND $v<15.60000000001) {
    echo 'We are doomed :S';
    var_dump($v); // float 15.6
} else {
    echo 'Everything is fine =)';
}

我想这与内部表现或一些模糊的低级别的东西有关?如果是这种情况,我该如何解决这个问题? 在用这个来计算真钱交易之前我应该​​知道的其他事情吗?

8 个答案:

答案 0 :(得分:8)

我确信这是重复的,所以我把它变成了CW

$v = 5.2 * 3;
if (bccomp($v, 15.6) === 0) {
    echo 'Everything is fine =)';
} else {
    echo 'Okay something is wrong :S';
    var_dump($v); // float 15.6
}

会给'一切都很好=)'

答案 1 :(得分:3)

它确实与内部表示有关:)。永远不要比较浮动值。我认为将存在解决此问题的php类/模块,但您也可以将货币值存储为整数并将它们乘以100。在显示之前,您可以再次分割它们:)

答案 2 :(得分:2)

这通常与浮点数有关,并不仅限于PHP。

使用浮动时,您应该检查具有特定精度的间隔,就像您在上一个示例中所做的那样:

if(abs($v - 15.6) < 0.0001)
{
    // Yey :)
}

使用精确值时可能会遇到很多问题。

答案 3 :(得分:2)

你得到的值是15.600000000000001,它与15.6不同,这个话题已被广泛讨论过,你可以看看这个主题:

HTH,问候

答案 4 :(得分:2)

PHP page on floats发出警告,禁止比较相等内容以及指向this page的链接bccomp

答案 5 :(得分:1)

如果你真的需要比较浮点数,请检查是否存在允许偏差的范围,而不是完全匹配,例如

$DEVIATION = 0.0001;
if(abs($v-15.6)<$DEVIATION) ...

答案 6 :(得分:1)

$v = 5.2 * 3;

if((string)$v == "15.6") {
    print "yes";
}

检查PHP网站总是好的,因为大多数开发人员在PHP.net Floating Point Number此评论显示用于比较浮点数的函数之前遇到了问题。

<?php 
    function IsFloatEqual($x,$y,$precision=0.0000001) 
    { 
        return ($x+$precision >= $y) && ($x-$precision <= $y); 
    } 
?> 

答案 7 :(得分:1)

对于任何寻找的人来说,只是一个小小的补充:

BC *函数是唯一在PHP中使用浮点数的真正方法!