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

摘要:
这可以根据publicfunctioncalc{$errors=array;switch($x){case'add':$t=bcadd;break;case'sub':$t=bcsub;break,case'mul':$t=bcmul;break;case'div':if($n!

一、前言

  我们在进行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)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇poj2689(素数区间筛法模板)stm32的双向io口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[php] 判断当前运行模式

//判断是否cgi模式 define('IS_CGI',substr(PHP_SAPI, 0,3)=='cgi' ? 1 : 0 ); //判断操作系统是否为windows define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 ); //判断是否命令行cli模式 define('IS_CLI',PHP_SAP...

php运用PhpAmqpLib操作队列

//安装类库 composer require php-amqplib/php-amqplib //consumer.php消费者代码 require __DIR__ . "/../vendor/autoload.php"; usePhpAmqpLibConnectionAMQPStreamConnection; $conf =[...

PHP 设计模式 笔记与总结(5)PHP 魔术方法的使用

PHP 魔术方法的使用 ① __get/__set:将对象的属性进行接管 当访问一个不存在的对象属性时: index.php <?php define('BASEDIR',__DIR__); //定义根目录常量 include BASEDIR.'/Common/Loader.php'; spl_autoload_register('\Commo...

PHP出现502解决方案

nginx 出现 502 有很多原因,但大部分原因可以归结为资源数量不够用,也就是说后端 php-fpm 处 理有问题,nginx 将正确的客户端请求发给了后端的 php-fpm 进程,但是因为 php-fpm 进程的问 题导致不能正确解析 php 代码,最终返回给了客户端 502 错误。 服务器出现 502 的原因是连接超时我们向服务器发送请求由于服务...

关于PHP的 PHP-FPM进程CPU 100%的分析和解决

在以往的开发过程中,碰到过php-fpm的原因导致CPU负载过高,load 20~50,严重影响了安全和服务稳定的问题,那怎么来查看和分析问题呢?请看下文。 1. 查看是否是硬件问题   方式:top  命令   主要查看:load average(平均负载),这是一个4核8G内存的服务器   1分钟平均负载:2.32;   5分钟平均负载:2.18;...

linux 系统 解决php -v查看到版本于phpinfo()打印的版本不一致问题

发现问题的原因:   安装zip扩展后,配置成功,但是使用gitlab合并的时候发生错误,经检查,使用phpinfo打印出来的php版本为7.1,而使用linux度服务器 运行 php -v的版本却是5.4,故怀疑加载的php.ini文件不一致 解决方案        首先查找一下linux上有几个php.ini。结果发现有两个:       使用命令来查...