出于示例的目的,var 2从数据库预设为“147.22”类型STRING。 var 1先前在脚本中计算并具有147.22类型FLOAT。
脚本:
<?
$var1 = (float)$var1;
$var2 = (float)$var2;
var_dump($var1);
var_dump($var2);
if($var1 < $var2) { echo "hello"; }
?>
我的预期结果是脚本不回显“hello”,因为两个值的数量和类型相等。
然而,这是我得到的输出:
float(197.22)
float(197.22)
hello
如果我没有弄乱这些类型并将其中一个浮动而另一个留下一个字符串,那么它仍然不起作用(这就是我首先来到这里的方式)。
如果我在执行时强制执行这样的值:
$var1 = 147.22;
$var2 = 147.22;
var_dump($var1);
var_dump($var2);
if($var1 < $var2) { echo "hello"; }
?>
我明白了,(并且有效):
float(197.22)
float(197.22)
请注意没有“你好”......
任何人都有任何线索在这里?
答案 0 :(得分:8)
如果其中一个浮点数是以数字方式计算的,而另一个是通过字符串赋值创建的,则它们可能不同。请尝试以下方法:
$x = 147.22;
$y = 147.2200000000001;
printf("%.40f\n", $x);
printf("%.40f\n", $y);
var_dump($x);
var_dump($y);
var_dump($x < $y);
输出
147.2199999999999988631316227838397026062012
147.2200000000001125499693443998694419860840
float(147.22)
float(147.22)
bool(true)
将它们转换为具有指定精度的字符串以进行比较。
答案 1 :(得分:2)
如果您正在处理花车,那么直接比较它们是不安全的,因为可能存在舍入或表示问题。
您最好检查这些数字之间的差异是否小于某个预定义且非常小的epsilon
,然后确定它们是否相等,哪个更大。
此讨论可能值得一读:Is casting to float destructive?
修改强>:
更多讨论要阅读: