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

      结束!!!

  • 相关阅读:
    面经
    Onedrive云盘程序——OneManager小白设置指南
    Docker 命令
    Linux 命令
    Spring boot 返回参数移除null属性
    Springboot
    正则
    JVM内存模型
    缓冲和缓存的区别
    SpringBoot如何优雅的将静态资源配置注入到工具类中
  • 原文地址:https://www.cnblogs.com/T8888/p/11848674.html
Copyright © 2020-2023  润新知