PHP 中浮點數的比較。


在 PHP 中,測試浮點數的相等性是有問題的,因為在檢查一個浮點數是否等於另一個浮點數時,PHP 會失敗。儘管浮點數看起來具有相同的值,但實際上並不需要完全相同。因此,本文將演示我們在比較浮點數時面臨的問題以及避免此問題的不同方法。

示例

讓我們用一個簡單的例子來測試一下

<?php
   $a = 0.14;
   $b = 1 - 0.86; //0.14
   if($a == $b ){
      echo 'a and b are same';
   }
   else {
      echo 'a and b are not same';
   }
?>

輸出

a and b are not same.

解釋

在此程式碼中,即使 $a 和 $b 相同,也會執行 else 條件而不是 if 條件。這是由於浮點值的特性及其內部表示方式造成的。讓我們討論 PHP 中的不同情況,以避免在實際應用中出現此問題。

情況 1

演示透過使用計算機系統中計算中的最小差異來比較浮點值。

示例

<?php
   $val1 = 2.183459;
   $val2 = 2.183450;
   $epsilon = 0.00001;
   if(abs($val1 - $val2) < $epsilon) {
      echo "True";
   }
   else {
      echo "False";
   }
?>

輸出

True

解釋

在這裡,我們使用了兩個浮點變數 val1 和 val2 以及 epsilon。然後,我們利用名為 abs() 的原生函式獲取變數 (val1 和 val2) 的絕對差值。此程式碼將給我們提供絕對值,但問題是為什麼我們要取絕對值?答案是我們可以看到這兩個值的小數位數在精度值 5 之前相同,這對於 PHP 來分析比較是困難的。

情況 2

使用 round() 函式。

<?php
   $val1 = 9 - 6.2;
   $val2 = 1.8;
   var_dump(round($val1, 2) == round($val2, 2));
?>

輸出

bool(true)

解釋

在這裡,我們使用了兩個浮點變數 val1 和 val2。然後,我們使用名為 round() 的預定義函式,將浮點值四捨五入到兩位小數,然後進行比較。在這裡,我們使用預定義的 round() 函式以正確的方式獲得我們期望的結果。

更新於:2019-12-31

753 次瀏覽

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告