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
?>