为了示例的目的,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
如果我不弄乱类型并保留一个 float 和另一个字符串,那么它仍然不起作用(这就是我首先到达这里的方式)。
如果我在执行时强制值是这样的:
$var1 = 147.22;
$var2 = 147.22;
var_dump($var1);
var_dump($var2);
if($var1 < $var2) { echo "hello"; }
?>
我明白了,(而且有效):
float(197.22)
float(197.22)
注意没有“你好”......
有人知道这里发生了什么吗?
最佳答案
如果其中一个 float 是按数字计算的,而另一个是从字符串赋值创建的,则它们可能不同。尝试以下操作:
$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)
将它们转换为具有指定精度的字符串以进行比较。
关于php - 小于运算符在 PHP 5.3.1 中无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8017365/