2010-11-25 56 views
2

php浮动有什么问题?Floats问题! (在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 =)'; 
} 

我猜它是与内部表示或一些模糊的低层次的东西?如果是这样的话,我该如何解决这个问题? 在使用它来计算真实货币交易之前,还有什么我应该知道的?

+0

[Real vs. Floating Point vs. Money]的可能重复(http://stackoverflow.com/questions/273371/real-vs-floating-point-vs-money) – Piskvor 2010-11-25 11:35:37

+2

*(reference)* http:///de.php。net/manual/en/function.bccomp.php – Gordon 2010-11-25 11:35:46

回答

7

我相信这是一个重复的,所以我在做这个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 
} 

会给 '一切都很好=)'

3

它确实与内部表示:)。永远不要比较浮点值。我认为将会存在解决这个问题的PHP类/模块,但是你也可以将你的货币值存储为整数,然后乘以100。在显示之前,您可以将它们再次分开:)

2

这与浮动通常有关,并不限于PHP。

当使用花车,你应该检查与特定精度间隔,就像你在过去的例子一样:

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

您可以使用精确值时,碰到了很多问题。

1

如果你真的需要比较花车您在允许的偏差,而不是完全匹配的界限是,像

$DEVIATION = 0.0001; 
if(abs($v-15.6)<$DEVIATION) ... 
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); 
    } 
?> 
1

只是一个小除了用于anywone寻找:

的BC *函数在PHP花车上班唯一正确的方法!