资讯专栏INFORMATION COLUMN

PHP BC Math 函数详解

zqhxuyuan / 2267人阅读

摘要:导语用计算的时候,会遇到高精度数带来的问题。好在提供了系统函数。下面把常用的函数封装下,做了个简单的示例。参考资料魔术方法任意精度数学。

导语

用 PHP 计算的时候,会遇到高精度数带来的问题。好在 PHP 提供了 BC 系统函数。下面把常用的 BC 函数封装下,做了个简单的示例。

代码示例
leftNumber = $leftNumber;
        $this->rightNumber = $rightNumber;
        $this->setScale();
    }

    /**
     * 设置数字
     * @param $name
     * @param $value
     * @return null
     */
    public function __set($name, $value)
    {
        if (!isset($this->$name)) {
            return null;
        }

        $this->$name = $value;
    }

    /**
     * 获取数字
     * @param $name
     * @return null
     */
    public function __get($name)
    {
        if (isset($this->$name)) {
            return $this->$name;
        } else {
            return null;
        }
    }

    /**
     * 执行方法
     * @param $functionName
     * @param string $arguments
     * @return null
     */
    public function __call($functionName, $arguments)
    {
        if (!method_exists($this, $functionName)) {
            return null;
        }

        // 设置小数点位数需要参数,其他不需要
        if (isset($arguments[0])) {
            return $this->$functionName($arguments[0]);
        }

        return $this->$functionName();
    }

    /**
     * 设置所有bc数学函数的默认小数点保留位数
     * http://php.net/manual/zh/function.bcscale.php
     * @param int $scale
     */
    private function setScale($scale = 2)
    {
        bcscale($scale);
    }


    /**
     * 2个任意精度数字的加法计算
     * http://php.net/manual/zh/function.bcadd.php
     * @return string
     */
    private function add()
    {
        return bcadd($this->leftNumber, $this->rightNumber);
    }

    /**
     * 2个任意精度数字的减法
     * http://php.net/manual/zh/function.bcsub.php
     * @return string
     */
    private function sub()
    {
        return bcsub($this->leftNumber, $this->rightNumber);
    }

    /**
     * 2个任意精度数字乘法计算
     * http://php.net/manual/zh/function.bcmul.php
     * @return string
     */
    private function mul()
    {
        return bcmul($this->leftNumber, $this->rightNumber);
    }

    /**
     * 2个任意精度的数字除法计算
     * http://php.net/manual/zh/function.bcdiv.php
     * @return string
     */
    private function div()
    {
        return bcdiv($this->leftNumber, $this->rightNumber);
    }

    /**
     * 比较两个任意精度的数字
     * 相等返回 0 ;左大于右返回 1 ;右大于左返回 -1
     * http://php.net/manual/zh/function.bccomp.php
     * @return int
     */
    private function comp()
    {
        return bccomp($this->leftNumber, $this->rightNumber);
    }

    /**
     * 对一个任意精度数字取模
     * http://php.net/manual/zh/function.bcmod.php
     * @return string
     */
    private function mod()
    {
        return bcmod($this->leftNumber, $this->rightNumber);
    }

    /**
     * 任意精度数字的乘方
     * http://php.net/manual/zh/function.bcpow.php
     * @return string
     */
    private function pow()
    {
        return bcpow($this->leftNumber, $this->rightNumber);
    }

    /**
     * 任意精度数字的二次方根
     * http://php.net/manual/zh/function.bcsqrt.php
     * @return string
     */
    private function sqrt()
    {
        return bcsqrt($this->leftNumber);
    }
}

$bc = new BCCalculate(3.45, 5.61);

var_dump($bc->leftNumber);// 获取数字 float(3.45)
echo "
"; $bc->leftNumber = 24.08; var_dump($bc->leftNumber);// 修改数字 float(24.08) echo "
"; var_dump($bc->add());// 注意返回值是字符串 string(5) "29.69" echo "
"; $bc->setScale(3);// 修改小数点后位数 var_dump($bc->sub());// string(6) "18.470" echo "
"; var_dump($bc->mul());// string(7) "135.088" echo "
"; var_dump($bc->div());// string(5) "4.292" echo "
"; var_dump($bc->comp());// int(1) echo "
"; $bc->leftNumber = 10; $bc->rightNumber = 4; var_dump($bc->mod());// string(1) "2" echo "
"; var_dump($bc->pow());// string(5) "10000" echo "
"; $bc->leftNumber = 16; var_dump($bc->sqrt());// string(5) "4.000" echo "
";
补充

涉及到金额的时候,可以看上一篇文章。


参考资料:PHP:魔术方法、BC Math 任意精度数学。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30055.html

相关文章

  • PHP 处理金额

    摘要:导语涉及到金额的代码,一定要谨慎处理。所幸的是,金额一般不会有太多的小数。那么存储的时候呢,一言以蔽之,以分为单位进行存储。格式化金额下面是格式化金额的实例格式化金额参考资料关于浮点数你应该知道的浮点数的一个常见问题的解答。 导语 涉及到金额的代码,一定要谨慎处理。刚好最近做了相关的功能,下面大概说一下。 存储 PHP 的浮点数是不能精确计算的,具体的可以看这篇文章。所幸的是,金额一般...

    asce1885 评论0 收藏0
  • URI编解码详解encodeURIComponent、encodeURI

    摘要:可选项目,一般使用隔开或隔开的键值对可选项目包,其它额外的标识信息和的不同这和长得也很相似,是的缩写,译为统一资源定位符。格式类似协议主机名具体地址可能还有参数这里有三个概念,统一资源标识符,统一资源定位符,统一资源名称。 URI URI是Universal Resource Identifier通用资源标志符,是一个用于标识某一互联网资源名称的字符串。 该种标识允许用户对任何(包括本...

    Youngdze 评论0 收藏0
  • 红皮书(4):引用类型

    摘要:类型类型重排序方法升序降序方法返回从参数指定位置开始到当前数组末尾的所有项。要注意的是,传递给构造函数的两个参数都是字符串不能把正则表达式字面量传递给构造函数。由于构造函数的模式参数是字符串,所以在某些情况下要对字符串进行双重转义。 Object类型 Array类型 重排序方法: compare 升序: function compare(value1, value2){ ...

    CoorChice 评论0 收藏0
  • 《JavaScript程序设计》 第7章 软件构架

    摘要:软件工程活动开发软件系统这一任务包括许多行为。前者要求对象之间具有特定关系,而后者是有关安全程序设计的这两都是大型系统构建过程中的重要组成部分。第一一个概念层级结构在本节后续部分介绍,后者信息隐藏将在下一节介绍。 7.1 软件工程活动 开发软件系统这一任务包括许多行为。必须为系统制作业务案例,必须收集、明确和整理需求,必须设计、协调、构建、测试、集成、部署和维护系统本身。软件工程领域研...

    antz 评论0 收藏0
  • 关于PHP精确计算模块

    摘要:精确计算的函数简介是的缩写。函数的参数都是操作数加上一个可选的,比如,如果没有提供,就用的缺省值。 PHP精确计算的BC函数 简介:bc是Binary Calculator的缩写。bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scal...

    MASAILA 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<