今天在坛子里遇到这么一个问题
<? php
$a
=
0.6
;
$b
=
0.3
;
$c
=
0.1
;
$d
=
$a
+
$b
+
$c
;
echo
$d
.
'
<br>
'
;
if
(
$d
!=
1
)
{
echo
$d
.
'
<br>
'
;
}
?>
显示结果为:
1
1
-----------------------------------
可当程序变为
<?
php
$a
=
0.5
;
$b
=
0.3
;
$c
=
0.2
;
$d
=
$a
+
$b
+
$c
;
echo
$d
.
'
<br>
'
;
if
(
$d
!=
1
)
{
echo
$d
.
'
<br>
'
;
}
?>
显示结果为:
1
-------------------------------------------------------------------------------------------------------------------------------------------------
这里$d的值都是1,怎么会出现不同的结果呢?把$d!=1再换为$d!==1时,这种情况就没有了。而且奇怪的是只有$a=0.6,$b=0.3,$c=0.1这一组数有这种情况,如果数值改为$a=0.1,$b=0.3,$c=0.6或是$a=0.3,$b=0.6,$c=0.1也或者是其他组合时,也不会出现此问题。
接下来,在PHPX的坛子里看到一个帖子,里面有一段更有趣的CODE,如下:
<?
php
$t1
=
0.1
+
0.1
+
0.4
;
$t2
=
0.3
+
0.1
+
0.2
;
echo
$t1
==
$t2
?
"
$t1==$t2
"
:
"
$t1<>$t2
"
;
echo
'
<br />
'
;
$t1
=
0.2
+
0.1
+
0.4
;
$t2
=
0.3
+
0.2
+
0.2
;
echo
$t1
==
$t2
?
"
$t1==$t2
"
:
"
$t1<>$t2
"
;
?>
其结果为:
0.6==0.6
0.7<>0.7
现在还不是很明白为什么会有这样的结果,但在坛子里有这么一段解释:
“ 浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。”
呵呵,看来以后在写程序的时候不能再忽略float和int或是其他数值类型了。如果有哪位朋友明白其原因,麻烦留言中说明一下。先在此谢谢了!

<? php









?>
1
1
-----------------------------------
可当程序变为











1
-------------------------------------------------------------------------------------------------------------------------------------------------
这里$d的值都是1,怎么会出现不同的结果呢?把$d!=1再换为$d!==1时,这种情况就没有了。而且奇怪的是只有$a=0.6,$b=0.3,$c=0.1这一组数有这种情况,如果数值改为$a=0.1,$b=0.3,$c=0.6或是$a=0.3,$b=0.6,$c=0.1也或者是其他组合时,也不会出现此问题。
接下来,在PHPX的坛子里看到一个帖子,里面有一段更有趣的CODE,如下:









0.6==0.6
0.7<>0.7
现在还不是很明白为什么会有这样的结果,但在坛子里有这么一段解释:
“ 浮点数精度
显然简单的十进制分数如同 0.1 或 0.7 不能在不丢失一点点精度的情况下转换为内部二进制的格式。这就会造成混乱的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期中的 8,因为该结果内部的表示其实是类似 7.9999999999...。
这和一个事实有关,那就是不可能精确的用有限位数表达某些十进制分数。例如,十进制的 1/3 变成了 0.3333333. . .。
所以永远不要相信浮点数结果精确到了最后一位,也永远不要比较两个浮点数是否相等。如果确实需要更高的精度,应该使用任意精度数学函数或者 gmp 函数。”
呵呵,看来以后在写程序的时候不能再忽略float和int或是其他数值类型了。如果有哪位朋友明白其原因,麻烦留言中说明一下。先在此谢谢了!