浮子有问题!(用PHP)

浮子有问题!(用PHP),php,floating-point,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 :

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 =)';
}
$v=5.2*3;

如果($v>15.6和$v,它确实与内部表示有关:)。永远不要比较浮点值。我认为会有一些php类/模块解决这个问题,但您也可以将货币值存储为整数,并将它们乘以
100
。在显示之前,您可以再次分割它们:)

这通常与浮点有关,并且不限于PHP

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

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

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

您得到的值是15.60000000000001,与15.6不同,此主题已被广泛讨论,您可以查看以下线程:


HTH,ADVICES

有一个警告,禁止进行相等性比较,并且还有链接指向哪个链接。

如果您确实需要比较浮动,请检查是否在允许偏差的范围内,而不是在精确匹配的范围内,如

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

如果(abs($v-15.6)我确信这是一个复制品,所以我把它做成了一个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
}
将给出“一切都很好”

查看PHP网站总是很好的,因为大多数开发人员在这条评论显示比较浮动的函数之前都遇到了问题

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

对于任何一个看起来都很不错的人来说,这只是一个小小的补充:

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

可能重复的(参考)这将有助于:
<?php 
    function IsFloatEqual($x,$y,$precision=0.0000001) 
    { 
        return ($x+$precision >= $y) && ($x-$precision <= $y); 
    } 
?>