你比较下这两个的结果就知道了
<?php
$a=0.6;
$b=0.3;
$c=0.1;
$d=$a+$b+$c;
echo $d;
if($d != float(1))
{
echo $d.' <br>';
}
?>
<?php
$a=0.6;
$b=0.3;
$c=0.1;
$d=$a+$b+$c;
echo $d;
if($d != 1)
{
echo $d.' <br>';
}
?>
<?php
$a=0.6;
$b=0.3;
$c=0.1;
$d=$a+$b+$c;
echo $d;
if($d != float(1))
{
echo $d.' <br>';
}
?>
<?php
$a=0.6;
$b=0.3;
$c=0.1;
$d=$a+$b+$c;
echo $d;
if($d != 1)
{
echo $d.' <br>';
}
?>
$b=0.3;
$c=0.1;$d=$a+$b+$c;echo $d.' <br>';if ($d ===1) {
echo 'd=1 <br>';
} else {
var_dump($d);
}
<?
$a=0.5;
$b=0.3;
$c=0.2;
$d=$a+$b+$c;
echo $d.'<br>';
if($d!=1)
{
echo $d.'<br>';
}
?>
可是上面的代码我改了一下数值
输出却是(只有一个1)
1
$a=0.5;
$b=0.3;
$c=0.2;
与
$a=0.6;
$b=0.3;
$c=0.1;
有什么区别,结果相反啊
$a=0.6;
$b=0.3;
$c=0.1;
$d=$a+$b+$c;
echo $d.'<br>';
if($d!=(float)1)
{
echo $d.'<br>';
}
?>
这样也是
1
1
但
$a=0.5;
$b=0.3;
$c=0.2;
就是
1
<?php
$a=0.6;
$b=0.3;
$c=0.1;
$d=$a+$b+$c;
echo $d;
if($d !==1)
{
echo $d.' <br>';
}
?>
if($d !==1) 也不行
其实我要判断这些数的和是不是1$a=60;
$b=30;
$c=10;
$d=$a+$b+$c;
echo $d;
if($d !=100)
{
echo $d.' <br>';
}
这样就行了
之后在每个除100倒霉这个魔数被我碰上了
$a=0.6;
$b=0.3;
$c=0.1;
$d=$a+$b+$c;
$e=0.5;
$f=0.3;
$g=0.2;
$h=$e+$f+$g;
echo var_dump($d).'<br>';
echo var_dump($h).'<br>';
if($d==$h)
{
echo 'd==h'.'<br>';
}
if($d===$h)
{
echo 'd===h'.'<br>';
}
if($d!=$h)
{
echo 'd!=h'.'<br>';
}
if($d!==$h)
{
echo 'd!==h'.'<br>';
}
?>
输出float(1)
float(1)
d!=h
d!==h
有意思
$a=0.2;
$b=0.7;
$c=0.1;
$d=$a+$b+$c;
echo $d.' <br>';
if($d!=1)
{
echo $d.' <br>';
}
?>1
1
$a=0.6;
$b=0.3;
$c=0.1;
$d=$a+$b+$c;
echo var_dump($d)."<br>";//结果:float(1)$a = 1;
echo var_dump($a)."<br>";//结果:int(1)$a = settype($a,"float");//$a类型转化为floatif($d != $a){
echo $d;
}
?>进行比较的两个变量类型不一样,并且!=为模糊比较,是否由此原因造成比较异常,思考
$a=0.6;
$b=0.3;
$c=0.1;
$d=$a+$b+$c;
var_dump($d);
if(!$d==1)
{
echo $d.' <br>';
}
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。原帖地址