Рубрики
Uncategorized

Подробное объяснение функции PHP BCMath

Автор оригинала: David Wong.

Представил

При вычислениях с помощью PHP мы столкнемся с проблемами, вызванными высокоточными числами. К счастью, PHP предоставляет системные функции BC. Ниже приведен простой пример инкапсуляции обычно используемых функций BC.

Пример кода

php

/**
 * Examples of BC Math functions
 * Class BCCalculate
 */
class BCCalculate
{
    Private $leftNumber; //left operand
    Private $rightNumber; //right operand

    public function __construct($leftNumber, $rightNumber)
    {
        $this->leftNumber = $leftNumber;
        $this->rightNumber = $rightNumber;
        $this->setScale();
    }

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

        $this->$name = $value;
    }

    /**
     * Get numbers
     * @param $name
     * @return null
     */
    public function __get($name)
    {
        if (isset($this->$name)) {
            return $this->$name;
        } else {
            return null;
        }
    }

    /**
     * Execution method
     * @param $functionName
     * @param string $arguments
     * @return null
     */
    public function __call($functionName, $arguments)
    {
        if (!method_exists($this, $functionName)) {
            return null;
        }

        // Setting decimal digits requires parameters, others do not.
        if (isset($arguments[0])) {
            return $this->$functionName($arguments[0]);
        }

        return $this->$functionName();
    }

    /**
     * Set the default decimal point reserved digits for all BC mathematical functions
     * http://php.net/manual/zh/function.bcscale.php
     * @param int $scale
     */
    private function setScale($scale = 2)
    {
        bcscale($scale);
    }


    /**
     * Addition of Two Arbitrary Precision Numbers
     * http://php.net/manual/zh/function.bcadd.php
     * @return string
     */
    private function add()
    {
        return bcadd($this->leftNumber, $this->rightNumber);
    }

    /**
     * Subtraction of Two Arbitrary Precision Numbers
     * http://php.net/manual/zh/function.bcsub.php
     * @return string
     */
    private function sub()
    {
        return bcsub($this->leftNumber, $this->rightNumber);
    }

    /**
     * Two Arbitrary Accuracy Digital Multiplication Calculations
     * http://php.net/manual/zh/function.bcmul.php
     * @return string
     */
    private function mul()
    {
        return bcmul($this->leftNumber, $this->rightNumber);
    }

    /**
     * Two Dividing Calculations with Arbitrary Accuracy
     * http://php.net/manual/zh/function.bcdiv.php
     * @return string
     */
    private function div()
    {
        return bcdiv($this->leftNumber, $this->rightNumber);
    }

    /**
     * Compare two numbers of arbitrary precision
     * Equal return 0; Left return 1; Right return 1; Left return - 1
     * http://php.net/manual/zh/function.bccomp.php
     * @return int
     */
    private function comp()
    {
        return bccomp($this->leftNumber, $this->rightNumber);
    }

    /**
     * Modeling of an arbitrary precision digit
     * http://php.net/manual/zh/function.bcmod.php
     * @return string
     */
    private function mod()
    {
        return bcmod($this->leftNumber, $this->rightNumber);
    }

    /**
     * Multiplier of Arbitrary Precision Numbers
     * http://php.net/manual/zh/function.bcpow.php
     * @return string
     */
    private function pow()
    {
        return bcpow($this->leftNumber, $this->rightNumber);
    }

    /**
     * Quadratic Roots of Arbitrary Precision Numbers
     * 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); // Get the digital float (3.45)
echo '
'; $bc->leftNumber = 24.08; Var_dump ($bc - > leftNumber); // Modify the number float (24.08) echo '
'; Var_dump ($bc - > add (); // Note that the return value is string (5) "29.69" echo '
'; BC - > setScale (3); // Modify the decimal post-digit 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: Магический метод, Математика произвольной точности BCMath.