no-image

PHP 基礎篇 – PHP 的 BC MATH 系列數學函式

                                    

一、常見問題

用 PHP 做計算時經常會遇到精度帶來的問題,下面來看兩個常見的例子:

1. 運算比較

下面表示式輸出的結果不是相等

2. 型別轉換

下面表示式輸出的結果不是201

你也許會覺得很奇怪,然而這並不是 PHP 的 bug,如果想深入瞭解可以參考鳥哥的兩篇文章:

關於PHP浮點數你應該知道的(All ‘bogus’ about the float in PHP)
PHP浮點數的一個常見問題的解答

二、BC MATH

用 PHP 提供的 BC MATH 系列數學函式可以解決上面的問題。對於任意精度的數學計算, BC MATH 提供了支援用字串表示的任意大小和精度的數字的二進位制計算,最多為2147483647-1(或0x7FFFFFFF-1)。

下面用 BC MATH 提供的函式解決上面的問題。

1. 運算比較

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

<?php

$num = bccomp(2.01 - 0.01, 2, 2);   
var_dump($num); // int(0)

注:如果兩個數相等返回 0, 左邊的數比較右邊的數大返回 1, 否則返回-1。

2. 型別轉換

bcmul — 2個任意精度數字乘法計算:

<?php

$num = bcmul(2.01, 100, 0);
var_dump($num);    // string(3) "201"
var_dump(intval($num));    // int(201)

注:返回結果為字串型別

使用 BC MATH 系列數學函式可以讓我們減少失誤,避免不必要的錯誤,如需檢視詳細引數和其它函式的使用,請查閱 PHP 官方文件:http://php.net/manual/zh/book.bc.php


本文首發於馬燕龍個人部落格,歡迎分享,轉載請標明出處。

馬燕龍個人部落格:http://www.mayanlong.com

馬燕龍個人微博:http://weibo.com/imayanlong

馬燕龍Github主頁:https://github.com/yanlongma


(adsbygoogle = window.adsbygoogle || []).push({});

function googleAdJSAtOnload() {
var element = document.createElement(“script”);
element.src = “//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js”;
element.async = true;
document.body.appendChild(element);
}
if (window.addEventListener) {
window.addEventListener(“load”, googleAdJSAtOnload, false);
} else if (window.attachEvent) {
window.attachEvent(“onload”, googleAdJSAtOnload);
} else {
window.onload = googleAdJSAtOnload;
}