我想我已经看了太久了。为什么这个代码打印'不',它应该打印'是'不应该吗?我已经在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';
}
?>
答案 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';
}
答案 3 :(得分:1)
答案 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或字符串转换