php中浮點數比較大小
技術標籤:PHP
在日常開發中,經常會涉及到浮點數比較,會出現看上去應該返回true,結果返回false的現象。比如:
var_dump(0.4-0.3==0.1);
執行 返回值
然後我們執行:
echo 0.4-0.3;
輸出結果 0.1 。看上去完全沒有問題。然而結果不是我們想要的,讓人很是頭疼。
其實,這就是二進位制儲存<這裡不做詳細講解>的問題了。
下面介紹一個函式,藉助函式我們可以看到以上減法輸出結果的‘真身’。
serialize<其實就是我們常見的序列化函式>
-
serialize
-
(PHP 4, PHP 5, PHP 7)
-
serialize — 產生一個可儲存的值的表示
-
描述
-
string serialize ( mixed $value )
執行程式碼:
echo serialize(0.4-0.3);
輸出 d:0.10000000000000003;
由此我們就可以非常清晰的看出 上述返回false的原因了。
那我們浮點數該如何比較呢?
1、轉化成字串進行比較,藉助函式 :strval
var_dump(strval(0.4-0.3)==0.1);
2、藉助浮點數比較大小函式
-
精度函式庫函式
-
bcadd — 將兩個高精度數字相加
-
bccomp — 比較兩個高精度數字,返回-1, 0, 1
-
bcdiv — 將兩個高精度數字相除
-
bcmod — 求高精度數字餘數
-
bcmul — 將兩個高精度數字相乘
-
bcpow — 求高精度數字乘方
-
bcpowmod — 求高精度數字乘方求模,數論裡非常常用
-
bcscale — 配置預設小數點位數,相當於就是Linux bc中的”scale=”
-
bcsqrt — 求高精度數字平方根
-
bcsub — 將兩個高精度數字相減
以 bccomp為例
-
bccomp
-
(PHP 4, PHP 5, PHP 7)
-
bccomp — 比較兩個任意精度的數字
-
說明
-
int bccomp ( string $left_operand , string $right_operand [, int $scale = int ] )
-
把right_operand和left_operand作比較, 並且返回一個整數的結果.
-
引數
-
left_operand
-
左邊的運算數, 是一個字串.
-
right_operand
-
右邊的運算數, 是一個字串.
-
scale
-
可選的scale引數被用作設定指示數字, 在使用來作比較的小數點部分.
-
返回值
-
如果兩個數相等返回0, 左邊的數left_operand比較右邊的數right_operand大返回1, 否則返回-1.
示例:
-
$a = 0.4-0.3;
-
var_dump(bccomp($a, 0.1));
3、四捨五入小數點後指定位數比較<少用> round
示例:
var_dump(round($a, 2) == 0.1);