php的精度計算問題(bcadd和bcsub)


一、前言

  我們在進行php開發的時候經常會遇到浮點型的問題,特別是涉及金額的部分,常常需要進行加減運算。當小數點的位數比較多的時候,往往容易犯一些很低級的錯誤。這里記錄一下php的精度計算和封裝的小demo

 

二、關於php的高精度問題

1、概念解釋

這篇文章的解釋最清楚:

php高精度計算問題

2、高精度數值對比大小問題

下面這篇文章講的很好:

臨時發一個項目遇到的PHP浮點計算問題

 

默認保留兩位小數

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);

  結束!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM