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 :(得分: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中使用浮点数的真正方法!