php的精度计算问题(bcadd和bcsub)

Posted 君乐豹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);

  结束!!!

以上是关于php的精度计算问题(bcadd和bcsub)的主要内容,如果未能解决你的问题,请参考以下文章

PHP 精准加减乘除

PHP精度问题

PHP精度计算函数

php里面bcadd是什么意思

PHP高精度数学运算函数

php 处理高精度计算函数