## PHP大數計算
通常在遇到浮點數計算的時候,會出現計算結果錯誤的問題,這是由于系統處理浮點數的方式決定的。那么這種時候,為了計算的嚴謹,需要采用特殊的計算方法去處理這些計算邏輯。
> 對于浮點數的說明,PHP官網有專門的章節來說明 [點我查閱](http://php.net/manual/zh/language.types.float.php)
我們先來看一組計算數據:
```
<?php
$a = 1.2345;
$b = 1.2344;
echo $a - $b;
// 理論上應該輸出 0.0001
// 實際上輸出的是 9.9999999999989E-5
```
無論該數值是否是科學計數法,在我們后續的計算中都是不可用的。
其實PHP已經為我們提供了一組專門用于計算的函數,成為bc函數,常用的方法有:
* **加:bcadd($p1, $p2, $scale)**
* **減:bcsub($p1, $p2, $scale)**
* **乘:bcmul($p1, $p2, $scale)**
* **除:bcdiv($p1, $p2, $scale)**
* ......
使用方法也很簡單:
```
<?php
$a = 1.2345;
$b = 1.2344;
echo bcadd($a, $b, 4); // output: 2.4689
echo bcsub($a, $b, 4); // output: 0.0001
echo bcmul($a, $b, 4); // output: 1.5238
echo bcdiv($a, $b, 4); // output: 1.0000
```
> 有個需要注意地方,函數的第三位是設置計算需要保留的小數位,但是切記bc函數保留的方式是直接抹掉不需要的位數,類似 **floor** 的用法,所以這里在保留小數位的時候,需要特別處理。
例如下面的代碼:
```
<?php
$a = 0.866;
$b = 1;
echo bcmul($a, $b, 2); // output: 0.86
echo round(bcmul($a, $b, 3), 2); // output: 0.87
```