非常简单的PHP添加问题

时间:2011-04-07 14:35:31

标签: php

我想我已经看了太久了。为什么这个代码打印'不',它应该打印'是'不应该吗?我已经在PHP 5.3和PHP 5.2上尝试了它,并且都打印了'no'。

<?php

$total = 14.05;
$var1 = 0;
$var2 = 0.11;
$var3 = 13.94;

if(($var1 + $var2 + $var3) == $total)
{
    echo 'yes';
}
else
{
    echo 'no';
}

?>

10 个答案:

答案 0 :(得分:6)

请参阅Comparing floating point numbers

这不起作用,因为没有准确表示浮点数。一个小的舍入误差足以使相等运算符失败。

答案 1 :(得分:2)

像其他人一样说,不要直接比较花车。 做一个     if(abs($ float1- $ float2)&lt; 0.0000001)

或similair

在你的情况下

<?php

$total = 14.05;
$var1 = 0;
$var2 = 0.11;
$var3 = 13.94;

if (abs(($var1 + $var2 + $var3)-$total)<0.000001)
{
    echo 'yes';
}
else
{
    echo 'no';
}

?>

答案 2 :(得分:1)

这是一种非常懒惰的方式:

$var4 = $var1 + $var2 + $var3;
$var4 = number_format($var4, 2);
$total = number_format($total, 2);

if($var4 == $total)
{
    echo 'yes';
}
else
{
    echo 'no';
}

http://php.net/number_format

答案 3 :(得分:1)

如果你需要做很多精确的浮点数学运算,那么值得使用像GMPBCMath这样的库

答案 4 :(得分:1)

如其他答案所述,比较花车时要小心。试试这个:

echo ((int)(($var1+$var2+$var3)-$total)==0)?"yes":"no";

答案 5 :(得分:0)

因为......你不能比较花车的平等......这是一个四舍五入的问题......像14.05这样的东西实际上表示为14.0499999 ...你所能做的只是与某种颂歌比较,例如如果a + t> = b> = a-t,则t = 0.01然后a = b将被认为是真的。

答案 6 :(得分:0)

我怀疑这是由于floating point precision

基本上浮点数不能以完全精确的方式存储,有时结果不是您所期望的。为了比较浮点数,您应该允许一些容差。如果您确定每个数字都有两个小数位,则可以乘以100以使它们成为整数值并比较总数。

答案 7 :(得分:0)

这是由浮点精度引起的。浮点数表示实际值,但仅限于一定精度。请尝试以下方法:

<?
$total = 14.05;
$var1 = 0;
$var2 = 0.11;
$var3 = 13.94;

if((($var1 + $var2 + $var3) > ($total - 0.0000001)) && (($var1 + $var2 + $var3) < ($total + 0.0000001)))
{
    echo 'yes';
}
else
{
    echo 'no';
}
?>

答案 8 :(得分:0)

这是一个基本的浮点数学问题。

计算机使用二进制数学。对于整数值,没有问题。但对于小数,它使用了一种称为浮点数学的技术。问题是浮点数好时,不直接映射到十进制值;甚至相对简单的十进制值也不可能精确地用二进制表示。

如果你总是使用两个小数位 - 例如货币 - 通常更好的办法是将你的价值作为整数处理(例如存储美分而不是美元,或便士而不是英镑),这样你所有的数学是使用整数完成的,结果将是准确的。您只需将其作为小数点用于显示目的,您可以在需要时进行此操作。

答案 9 :(得分:0)

浮点值的精度有限。因此价值可能 任何处理后都没有相同的字符串表示。那也是 包括在脚本中直接写入浮点值 在没有任何数学运算的情况下打印它。

如果您想了解更多关于“浮动”以及IEEE的内容 754是,读到这个:

http://docs.sun.com/source/806-3568/ncg_goldberg.html

你可以在比赛前使用number_formattig或字符串转换