一、前言

  我们在进行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);

  结束!!!

01-04 10:32