1. 程式人生 > 其它 >php中浮點數比較大小

php中浮點數比較大小

技術標籤:PHP

在日常開發中,經常會涉及到浮點數比較,會出現看上去應該返回true,結果返回false的現象。比如:

var_dump(0.4-0.3==0.1);

執行 返回值

然後我們執行:

echo 0.4-0.3;

輸出結果 0.1 。看上去完全沒有問題。然而結果不是我們想要的,讓人很是頭疼。

其實,這就是二進位制儲存<這裡不做詳細講解>的問題了。

下面介紹一個函式,藉助函式我們可以看到以上減法輸出結果的‘真身’。

serialize<其實就是我們常見的序列化函式>


  1. serialize

  2. (PHP 4, PHP 5, PHP 7)

  3. serialize — 產生一個可儲存的值的表示

  4. 描述

  5. 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、藉助浮點數比較大小函式


  1. 精度函式庫函式

  2. bcadd — 將兩個高精度數字相加

  3.   bccomp — 比較兩個高精度數字,返回-1, 0, 1

  4.   bcdiv — 將兩個高精度數字相除

  5.   bcmod — 求高精度數字餘數

  6.   bcmul — 將兩個高精度數字相乘

  7.   bcpow — 求高精度數字乘方

  8.   bcpowmod — 求高精度數字乘方求模,數論裡非常常用

  9.   bcscale — 配置預設小數點位數,相當於就是Linux bc中的”scale=”

  10.   bcsqrt — 求高精度數字平方根

  11.   bcsub — 將兩個高精度數字相減

bccomp為例


  1. bccomp

  2. (PHP 4, PHP 5, PHP 7)

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

  4. 說明

  5. int bccomp ( string $left_operand , string $right_operand [, int $scale = int ] )

  6. 把right_operand和left_operand作比較, 並且返回一個整數的結果.

  7. 引數

  8. left_operand

  9. 左邊的運算數, 是一個字串.

  10. right_operand

  11. 右邊的運算數, 是一個字串.

  12. scale

  13. 可選的scale引數被用作設定指示數字, 在使用來作比較的小數點部分.

  14. 返回值

  15. 如果兩個數相等返回0, 左邊的數left_operand比較右邊的數right_operand大返回1, 否則返回-1.

示例:


  1. $a = 0.4-0.3;

  2. var_dump(bccomp($a, 0.1));

3、四捨五入小數點後指定位數比較<少用> round

示例:

var_dump(round($a, 2) == 0.1);