Автор оригинала: 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.