sqrt()是PHP 的一個內置函數,用於返回一個數字的平方根。其語法如下:
sqrt(float $num): float
例如:
echo sqrt(2); // 輸出 1.4142135623731
該函數返回的是一個浮點數,基於系統底層的雙精度浮點數(double)實現。
bcsqrt()是BC Math 擴展提供的函數,用於以高精度方式計算平方根。其語法如下:
bcsqrt(string $operand, int $scale = 0): string
例如:
echo bcsqrt('2', 50);
// 輸出 1.4142135623730950488016887242096980785696718753769480732
與sqrt()不同的是, bcsqrt()返回的是字符串類型的數值,可以指定結果的小數位數( scale參數)。
sqrt()使用的浮點數在精度方面存在天然限制。 PHP 的浮點數精度一般為14 位左右,適合大多數日常應用場景。但在涉及金融、科學計算或者加密算法等場景中,有限精度會導致結果不准確。
而bcsqrt()是基於字符串的高精度數學運算,精度完全由開發者控制。例如,我們可以輕鬆地計算100 位小數的平方根,這對於需要精密計算的程序是至關重要的。
比較示例:
$num = '2';
echo 'sqrt: ' . sqrt((float)$num) . PHP_EOL;
echo 'bcsqrt: ' . bcsqrt($num, 100) . PHP_EOL;
輸出結果可能如下:
sqrt: 1.4142135623731
bcsqrt: 1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573
可見, bcsqrt()提供的結果遠比sqrt()精確得多。
高精度計算<br> 允許開發者自行控制小數精度,避免浮點誤差
穩定性更高<br> 對於非常小或非常大的數字, bcsqrt()表現得更穩定,不容易出現溢出或舍入錯誤
適用範圍廣泛<br> 在涉及金融運算(如利息計算、貨幣兌換)、科學工程應用中尤為重要
類型安全<br> 返回值為字符串,有利於保持原始數據的完整性和一致性,避免浮點數舍入誤差
假設我們有一個加密貨幣應用,需要對用戶存款進行複雜的利率計算。在這種場景下,我們無法容忍任何精度誤差。
$principal = '10000.00';
$rate = '0.05'; // 5%
$years = '3';
// 計算複利終值:FV = P * (1 + r)^n
$growth = bcpow(bcadd('1', $rate, 10), $years, 20);
$final = bcmul($principal, $growth, 20);
echo 'Final amount after 3 years: ' . $final;
上面的代碼完全避免了浮點數計算,確保了利息計算的精確性,適用於https://gitbox.net上的金融應用模塊。