【PHP】 bcmath擴充套件庫 – 處理任意精度數字函式

PHP 存在著浮點數計算的精度問題,有時候在運算浮點數時,所得到的結果會不正確。
針對這個缺陷PHP提供了 bcmath 擴充套件庫,來處理浮點數計算缺陷問題。

官方文件當中提供的函式有下面這些:

bcadd — 兩個任意精度數字相加。 
● bccomp — 比較兩個任意精度的數字。 
● bcdiv — 兩個任意精度數字相除。 
● bcmod — 獲取任意精度數字的mod(取餘數)。 
● bcmul — 兩個任意精度數字相乘。 
● bcpow — 任意精度數字的次方。 
● bcpowmod — 先次方再取mod。 
● bcscale — 設定所有bc數學函式的預設小數點保留位數。 
● bcsqrt — 任意精度數字的二次方根。 
● bcsub — 兩個任意精度數字的減法。

bcadd – 兩任意精度數字的加法計算

bcadd(string $num1, string $num2, ?int $scale = null): string

參數

$num1:任意精度數字1。

$num2:任意精度數字2。

$scale:要保留的小數點位數 (可為NULL)。

返回:任意精度$num1與任意精度$num2相加的值。

<?php
// 官方範例
$a = '1.234';
$b = '5';
echo bcadd($a, $b); // 6
echo bcadd($a, $b, 4); // 6.2340
?>

bccomp – 比較兩個任意精度的數字

bccomp(string $num1, string $num2, ?int $scale = null): int

參數

$num1:左任意精度數字1。

$num2:右任意精度數字2。

$scale:要保留的小數點位數 (可為NULL)。

返回:如果左右兩數相等,返回0;左邊$num1比$num2大,返回1:其他則返回-1。

<?php
// 官方範例
echo bccomp('1', '2') . "\n"; // -1
echo bccomp('1.00001', '1', 3); // 0
echo bccomp('1.00001', '1', 5); // 1
?>

bcdiv – 兩個任意精確的數字除法計算

bcdiv(string $num1, string $num2, ?int $scale = null): string

參數

$num1:被除數。

$num2:除數。

返回:除法計算的結果。如果 num2 是 0 結果為 null。

<?php
// 官方範例
echo bcdiv('105', '6.55957', 3); // 16.007
?>

bcmod – 任意精確數字取mod(餘數)

bcmod(string $num1, string $num2, ?int $scale = null): string

參數

$num1:被除數。

$num2:除數。

返回:字符串類型取mod後的結果,如果 num2 為 0 則返回 null。

<?php
// 官方範例
bcscale(0);
echo bcmod( '5', '3'); // 2
echo bcmod( '5', '-3'); // 2
echo bcmod('-5', '3'); // -2
echo bcmod('-5', '-3'); // -2
?>

bcmul – 兩個任意精確數字乘法計算

bcmul(string $num1, string $num2, ?int $scale = null): string

參數

$num1:左任意精度數字1。

$num2:右任意精度數字2。

$scale:要保留的小數點位數 (可為NULL)。

返回:乘法計算的結果。

<?php
// 官方範例
echo bcmul('1.34747474747', '35', 3); // 47.161
echo bcmul('2', '4'); // 8
?>

bcpow – 任意精確數字的乘方

bcpow(string $num, string $exponent, ?int $scale = null): string

參數

$num:底數。

$exponent:指數。

$scale:要保留的小數點位數 (可為NULL)。

返回:乘方計算的結果。

<?php
// 官方範例
echo bcpow('4.2', '3', 2); // 74.08
?>
<?php
// 官網範例 7.3.0 以前的版本
echo bcpow('5', '2', 2);     // prints "25", not "25.00"
?>

bcpowmod – 先乘方再取mod

bcpowmod(
string $num, 
string $exponent, 
string $modulus,
?int $scale = null
): string

參數

$num:基數。

$exponent:指數。

$modulus:要取mod的數。

$scale:要保留的小數點位數 (可為NULL)。

<?php
// 官方範例
$a = bcpowmod($x, $y, $mod);
$b = bcmod(bcpow($x, $y), $mod);
// $a and $b are equal to each other.
?>
$a = bcpowmod(2, 4, 10,2); // 相當於 bcmod(bcpow(2,4),10,2)
var_dump($a); //結果:string(4) "6.00"

bcscale – 設置/獲取所有 bcmath 函數的默認小數點保留數

bcscale(int $scale): int

參數

$scale:要保留的小數點位數

<?php
// 官方範例
// 默認小數點數: 3
bcscale(3);
echo  bcdiv('105', '6.55957'); // 16.007

// 不調用 bcscale() 也一樣
echo bcdiv('105', '6.55957', 3); // 16.007
?>

bcsqrt – 任意精確數字的開根號

bcsqrt(string $num, ?int $scale = null): string

參數

$num:操作的數字。

$scale:要保留的小數點位數 (可為NULL)。

返回:開根號的結果。

<?php
// 官方範例
echo bcsqrt('2', 3); // 1.414
?>

bcsub – 兩個任意精確數字的減法

bcsub(string $num1, string $num2, ?int $scale = null): string

參數

$num1:左任意精度數字1。

$num2:右任意精度數字2。

$scale:要保留的小數點位數 (可為NULL)。

返回:$num1 減 $num2 之後的結果。

<?php
// 官方範例
$a = '1.234';
$b = '5';
echo bcsub($a, $b);     // -3
echo bcsub($a, $b, 4);  // -3.7660
?>

 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

PHP Code Snippets Powered By : XYZScripts.com
返回頂端