一、前言
我們在進行php
開發的時候經常會遇到浮點型的問題,特別是涉及金額的部分,常常需要進行加減運算。當小數點的位數比較多的時候,往往容易犯一些很低級的錯誤。這里記錄一下php
的精度計算和封裝的小demo
。
二、關於php的高精度問題
1、概念解釋
這篇文章的解釋最清楚:
2、高精度數值對比大小問題
下面這篇文章講的很好:
默認保留兩位小數
bcadd(參數1,參數2,參數3)
參數1 和2 是要相加的參數 3是保留幾位小數。
1. bcadd 任意精度數的相加
2. bcsub 任意精度數的減法
3. bcmul 乘法, bcdiv除法
4. bcmod 取余數。 (比%功能更強大)
5. bcpow 冪函數運算
6. bcsqrt 平方根
7. sqrt 平方根運算
7. pow求冪
8. abs 求絕對值
9. pi 得到圓周率數值
10.bccomp — 比較
三、封裝的小demo
//$m和$n代表傳入的兩個數值,主要就是這兩個數值之間的比較 //$x代表傳入的方法,比如是;add,sub等 //$scale 代表傳入的小數點位數。這個根據需求更改即可 public function calc($m,$n,$x,$scale){ $errors=array( '被除數不能為零', '負數沒有平方根' ); switch($x){ case 'add': $t=bcadd($m,$n,$scale); break; case 'sub': $t=bcsub($m,$n,$scale); break; case 'mul': $t=bcmul($m,$n); break; case 'div': if($n!=0){ $t=bcdiv($m,$n); }else{ return $errors[0]; } break; case 'pow': $t=bcpow($m,$n); break; case 'mod': if($n!=0){ $t=bcmod($m,$n); }else{ return $errors[0]; } break; case 'sqrt': if($m>=0){ $t=bcsqrt($m); }else{ return $errors[1]; } break; } return $t; }
調用方式:
$result= $this->calc(2.001,3.002,'sub',3);
結束!!!