首頁  >  文章  >  後端開發  >  php浮點數計算錯誤的原因

php浮點數計算錯誤的原因

(*-*)浩
(*-*)浩原創
2019-10-16 10:01:322575瀏覽

php浮點數計算錯誤的原因

範例:  (建議學習:PHP影片教學

echo intval(0.58*100);//结果为57
echo intval((0.1 + 0.7) * 10);//结果为7

產生這樣的原因是計算機內部對部分浮點數不能準確地用二進位表示,就像我們不能用十進制準確表示10/3一樣.

##浮點數在計算機內部的表示:IEEE 754.不懂的自己查找資料

也可以參考鳥哥這篇文章:http://www.laruence.com/2013/03/26/2884.html

<?php
echo intval(0.58*100);//57,注意啦
echo &#39;<br/>&#39;;
echo intval(bcmul(0.58, 100));//58
echo &#39;<br/>&#39;;
echo floor(strval(0.58*100));//58
echo &#39;<br/>&#39;;
echo (int)(0.58 * 1000/10);//58
echo &#39;<br/>&#39;;
echo intval((0.1 + 0.7) * 10);//7,注意啦
echo &#39;<br/>&#39;;
echo intval(bcadd("0.1", "0.7",1) * 10);  //8
?>

再看一個範例

<?php
if((0.1 + 0.7) == 0.8){
	echo &#39;相等&#39;; 
}else{
	echo &#39;不相等&#39;; //这里输出
}
echo &#39;<br />&#39;;
$a = 0.1 + 0.7;
echo $a; //0.8
echo &#39;<br/>&#39;;
if($a == 0.8){ 
	echo &#39;一天一小步&#39;;
}else{
	echo &#39;一年一大步&#39;; //这里输出
}
echo &#39;<br/>&#39;;
if(strval($a) == 0.8){
	echo &#39;一天一小步&#39;; //这里输出
}else{
	echo &#39;一年一大步&#39;; 
}
echo &#39;<br/>&#39;;
if(bcadd(0.1, 0.7,1) == 0.8){
	echo &#39;一天一小步&#39;; //这里输出
}else{
	echo &#39;一年一大步&#39;;
}
/*
结果:
不相等
0.8
一年一大步
一天一小步
一天一小步
*/
?>

$a = 0.00...00(n個0)1 0.7;用strval對$a進行取值的時候,會因為n個0的個數不同,導致$a和0.8是否相等的結果不同

而bcadd函數會對2個數相加,根據你選擇保留幾個小數,而捨棄後面的小數

看個除法範例:

##

<?php
echo 160500643816367088/10;//1.6050064381637E+16
echo &#39;<br/>&#39;;
echo intval(160500643816367088/10);//16050064381636710
echo &#39;<br/>&#39;;
echo bcdiv(160500643816367088,10);//16050064381636708
?>

所以對於浮點數來計算金額這些敏感的資料,建議使用PHP的BC函數

以上是php浮點數計算錯誤的原因的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn