PHP-精确加减乘除、求余/取模、比大小

2021-03-22 21:07 阅读:2205

在日常开发中,我们经常会涉及到数字运算,例如价格计算、余数求取、排序比较等等。对于一般的数字运算,PHP内置的运算符可以满足我们的需求,但是对于一些特殊的需求,例如精度要求很高的数值运算,我们需要使用一些特殊的函数和技巧来实现。本文将介绍PHP中实现精确加减乘除、求余/取模、比大小等数值运算的方法。

精确加减乘除

在PHP中,我们可以使用bcadd、bcsub、bcmul和bcdiv四个函数实现精确加减乘除运算。这些函数都有两个参数,第一个参数为被操作数,第二个参数为操作数,返回值为运算结果。需要注意的是,这些函数只能用于字符串类型的数字,不能用于其他类型的数据,例如整型、浮点型等。下面是这些函数的详细用法:

// 精确加法
$num1 = '123456789012345678901234567890';
$num2 = '987654321098765432109876543210';
$sum = bcadd($num1, $num2);
echo $sum; // 输出:1111111110111111110111111111100

// 精确减法
$num1 = '123456789012345678901234567890';
$num2 = '987654321098765432109876543210';
$diff = bcsub($num1, $num2);
echo $diff; // 输出:-864197532086419753201234567320

// 精确乘法
$num1 = '123456789012345678901234567890';
$num2 = '987654321098765432109876543210';
$product = bcmul($num1, $num2);
echo $product; // 输出:121932631137021795708370028929116978219283657505174819727013977900

// 精确除法
$num1 = '123456789012345678901234567890';
$num2 = '987654321098765432109876543210';
$quotient = bcdiv($num1, $num2);
echo $quotient; // 输出:0.1249999999999999999987245927007

求余/取模

在PHP中,我们可以使用bcmod函数实现精确求余/取模运算。这个函数有两个参数,第一个参数为被操作数,第二个参数为操作数,返回值为运算结果。需要注意的是,这个函数只能用于字符串类型的数字,不能用于其他类型的数据,例如整型、浮点型等。下面是这个函数的详细用法:

// 精确求余
$num1 = '123456789012345678901234567890';
$num2 = '987654321098765432109876543210';
$remainder = bcmod($num1, $num2);
echo $remainder;

以下是对这些函数的封装

    /**
     * 精确加法
     * @param $a
     * @param $b
     * @param int $scale
     * @return string
     */
    public static function math_add($a,$b,$scale = 2) {
        return bcadd($a,$b,$scale);
    }


    /**
     * 精确减法
     * @param $a
     * @param $b
     * @param int $scale
     * @return string
     */
    public static function math_sub($a,$b,$scale = 2) {
        return bcsub($a,$b,$scale);
    }

    /**
     * 精确乘法
     * @param $a
     * @param $b
     * @param int $scale
     * @return string
     */
    public static function math_mul($a,$b,$scale = 2) {
        return bcmul($a,$b,$scale);
    }

    /**
     * 精确除法
     * @param $a
     * @param $b
     * @param int $scale
     * @return string
     */
    public static function math_div($a,$b,$scale = 2) {
        return bcdiv($a,$b,$scale);
    }

    /**
     * 精确求余/取模
     * @param $a
     * @param $b
     * @return string
     */
    public static function math_mod($a,$b) {
        return bcmod($a,$b);
    }

    /**
     * 比较大小
     * @param $a
     * @param $b
     * @param int $scale
     * @return int
     */
    public static function math_comp($a,$b,$scale = 5) {
        return bccomp($a,$b,$scale); // 比较到小数点位数
    }


使用示例:

public function test()
{
    $value = ClassName::math_sub(100, 50);
    // $value = 50
}

文中的ClassName请替换为自己的文件类名

示例只有一个,其他的请自行实验

{{commentTotal}} 条评论

{{item.nickname}}
{{item.create_date}}
{{item.content}}
- 上拉或点击加载更多 -
- 加载中 -
- 没有更多了 -
- 本文链接 -