《PHP編程:php 浮點數比較方法詳解》要點:
本文介紹了PHP編程:php 浮點數比較方法詳解,希望對您有用。如果有疑問,可以聯系我們。
浮點數運算精度問題PHP實例
首先看一個例子:PHP實例
<?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($a+$b)==$c); var_dump(($c-$b)==$a); ?>
$a+$b==$c 返回true,正確
$c-$b==$a 返回false,錯誤PHP實例
為什么會這樣呢? PHP實例
運算后,精度為20位時實際返回的內容如下:PHP實例
<?php $a = 0.1; $b = 0.9; $c = 1; printf("%.20f", $a+$b); // 1.00000000000000000000 printf("%.20f", $c-$b); // 0.09999999999999997780 ?>
$c-$b 為 0.09999999999999997780,因此與0.1比較返回falsePHP實例
出現這個問題是因為浮點數計算涉及精度,當浮點數轉為二進制時有可能會造成精度丟失.PHP實例
浮點數轉二進制方法PHP實例
整數部分采用除以2取余方法PHP實例
小數部分采用乘以2取整方法PHP實例
例如:把數字8.5轉為二進制 PHP實例
整數部分是8 PHP實例
8/2=4 8%2=0
4/2=2 4%2=0
2/2=1 2%2=0PHP實例
1比2小,因此不需要計算下去,整數8的二進制為 1000PHP實例
小數部分是0.5 PHP實例
0.5x2 = 1.0PHP實例
因取整后小數部分為0,因此不需要再計算下去PHP實例
小數0.5的二進制為 0.1PHP實例
8.5的二進制為1000.1PHP實例
計算數字0.9的二進制 PHP實例
0.9x2=1.8
0.8x2=1.6
0.6x2=1.2
0.2x2=0.4
0.4x2=0.8
0.8x2=1.6PHP實例
…. 之后不斷循環下去,當截取精度為N時,N后的數會被舍去,導致精度丟失.PHP實例
上例中0.9在轉為二進制時精度丟失,導致比較時出現錯誤.PHP實例
所以永遠不要相信浮點數已精確到最后一位,也永遠不要比較兩個浮點數是否相等. PHP實例
正確比較浮點數的方法PHP實例
1.使用round方法處理后再比較 PHP實例
例子:PHP實例
<?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($c-$b)==$a); // false var_dump(round(($c-$b),1)==round($a,1)); // true ?>
2.使用高精度運算方法 PHP實例
首先進行運算時,使用高精度的運算方法,這樣可以保證精度不丟失.PHP實例
高精度運算的方法如下: PHP實例
bcadd 將兩個高精度數字相加PHP實例
bccomp 比較兩個高精度數字,返回-1,0,1PHP實例
bcdiv 將兩個高精度數字相除PHP實例
bcmod 求高精度數字余數PHP實例
bcmul 將兩個高精度數字相乘PHP實例
bcpow 求高精度數字乘方PHP實例
bcpowmod 求高精度數字乘方求模PHP實例
bcscale 配置默認小數點位數,相當于Linux bc中的”scale=”PHP實例
bcsqrt 求高精度數字平方根PHP實例
bcsub 將兩個高精度數字相減PHP實例
例子:PHP實例
<?php $a = 0.1; $b = 0.9; $c = 1; var_dump(($c-$b)==$a); // false var_dump(bcsub($c, $b, 1)==$a); // true ?>
以上就是本文的全部內容,希望本文的內容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持維易PHP!PHP實例
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/843.html