PHP
 Computer >> コンピューター >  >> プログラミング >> PHP

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が同じであっても、if条件の代わりにelse条件が実行されます。浮動小数点値が内部的に表現された方法は、浮動小数点値の特性によるものです。この問題をリアルタイムで回避するために、PHPのさまざまなケースについて説明しましょう。

ケース1:

コンピュータシステムでの計算の最小の差を使用して、浮動小数点値の比較を示します。

例:

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

出力:

True

説明:

ここでは、イプシロンと一緒に2つの浮動小数点変数val1とval2を使用しています。次に、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)

説明:

ここでは、2つの浮動小数点変数val1とval2を使用しています。次に、round()という名前の事前定義された関数を使用します。これは、浮動小数点の値を小数点以下2桁まで四捨五入して、比較します。ここでは、事前定義されたround()関数を使用して、期待される結果を正しい方法で取得しています。


  1. C#の浮動小数点リテラルとは何ですか?

    浮動小数点リテラルには、整数部分、小数点、小数部分、および指数部分があります。浮動小数点リテラルは、10進形式または指数形式のいずれかで表すことができます。 以下は、浮動小数点リテラルの例の一部です- 9.23456 269485E-5F 浮動小数点リテラルを出力してみましょう- 例 using System; namespace Demo {    class Program {       static void Main(string[] args) {          //

  2. C#での整数リテラルと浮動小数点リテラル

    整数リテラル 整数リテラルは、10進数または16進数の定数にすることができます。接頭辞は基数または基数を指定します。16進数の場合は0xまたは0Xであり、10進数の場合は接頭辞IDはありません。整数リテラルの例のいくつかを次に示します- 10 // int 18u // unsigned int 変数を宣言して初期化するときに、上記のリテラルを使用してみましょう- // int int a =10; 値を出力します- 例 using System; namespace Demo {    class Program {       st