關於php 浮點數比較方法 的講解

來源:互聯網
上載者:User

浮點數運算精度問題

首先看一個例子:

<?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,錯誤

為什麼會這樣呢?
運算後,精度為20位時實際返回的內容如下:

<?php$a = 0.1;$b = 0.9;$c = 1;printf("%.20f", $a+$b); // 1.00000000000000000000printf("%.20f", $c-$b); // 0.09999999999999997780?>

$c-$b 為 0.09999999999999997780,因此與0.1比較返回false

出現這個問題是因為浮點數計算涉及精度,當浮點數轉為二進位時有可能會造成精度丟失。

浮點數轉二進位方法

整數部分採用除以2取餘方法
小數部分採用乘以2取整方法

例如:把數字8.5轉為二進位
整數部分是8
8/2=4 8%2=0
4/2=2 4%2=0
2/2=1 2%2=0
1比2小,因此不需要計算下去,整數8的二進位為 1000

小數部分是0.5
0.5x2 = 1.0
因取整後小數部分為0,因此不需要再計算下去
小數0.5的二進位為 0.1

8.5的二進位為1000.1

計算數字0.9的二進位
0.9x2=1.8
0.8x2=1.6
0.6x2=1.2
0.2x2=0.4
0.4x2=0.8
0.8x2=1.6
…. 之後不斷迴圈下去,當截取精度為N時,N後的數會被捨去,導致精度丟失。
上例中0.9在轉為二進位時精度丟失,導致比較時出現錯誤。

所以永遠不要相信浮點數已精確到最後一位,也永遠不要比較兩個浮點數是否相等。

正確比較浮點數的方法

1.使用round方法處理後再比較
例子:

<?php$a = 0.1;$b = 0.9;$c = 1;var_dump(($c-$b)==$a);                   // falsevar_dump(round(($c-$b),1)==round($a,1)); // true?>


2.使用高精度運算方法
首先進行運算時,使用高精度的運算方法,這樣可以保證精度不丟失。

高精度運算的方法如下:
bcadd 將兩個高精度數字相加
bccomp 比較兩個高精度數字,返回-1,0,1
bcp 將兩個高精度數字相除
bcmod 求高精度數字餘數
bcmul 將兩個高精度數字相乘
bcpow 求高精度數字乘方
bcpowmod 求高精度數字乘方求模
bcscale 配置預設小數點位元,相當於Linux bc中的”scale=”
bcsqrt 求高精度數字平方根
bcsub 將兩個高精度數字相減

例子:

<?php$a = 0.1;$b = 0.9;$c = 1;var_dump(($c-$b)==$a);          // falsevar_dump(bcsub($c, $b, 1)==$a); // true?>

本文講解了關於php 浮點數比較方法,更多相關內容請關注php中文網。

相關推薦:

通過mysql匯出查詢結果到csv方法的講解

php array_push 與 $arr[]=$value 之間的效能對比

如何利用php設定一個嚴格控制到期時間的session

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.