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

PHPでfloat値(浮動小数点数)を正しく比較する方法

PHPでfloat値(浮動小数点数)を比較する場合、== 演算子による直接比較は内部誤差の影響を受けやすいため注意が必要です。そこで一般的に使われるのが、2つの値の差の絶対値が許容誤差より小さいかどうかを判定する方法です。以下にそのサンプルコードを示します。

サンプルコード

<?php
$val_1 = 56.5325;
$val_2 = 90.899;
$val_3 = 0.11;
if(abs($val_1 - $val_2) < $val_3)
{
   echo "The values are same";
}
else
{
   echo "The values are not same";
}
?>

出力結果

The values are not same

コードの解説

まず、3つの浮動小数点数の変数 $val_1、$val_2、$val_3 を定義しています。このうち $val_3 は、許容誤差(イプシロン)として機能する値です。

abs($val_1 - $val_2) によって2つの値の差の絶対値を計算し、その結果が $val_3 よりも小さければ「値は等しい」と判断します。この例では $val_1 と $val_2 の差が 0.11 を超えるため、「The values are not same(値は等しくない)」というメッセージが出力されます。

なぜ直接比較してはいけないのか

浮動小数点数はコンピュータの内部では2進数による近似値として扱われるため、人間の目には同じように見える値でも、内部的にはわずかな誤差を持つことがあります。そのため、== 演算子で厳密に比較すると、意図しない結果になるケースがあります。

上記のように abs() を使って「差の絶対値」と「許容誤差」を比較する手法を採用すれば、丸め誤差の影響を抑えながら、float値の等価性を安全に判定することができます。

  1. PHPのarsort()関数の使い方:配列を降順ソートしてキーの関連性を保持する方法

    arsort()関数とはarsort()関数は、配列を降順(逆順)にソートするPHPの組み込み関数です。最大の特徴は、ソート後もキーと値の関連性(インデックスの関連付け)が維持される点にあります。連想配列を値の大きい順に並べ替えたい場合に特に便利です。構文arsort(arr, compare)パラメータarr − ソート対象の配列を指定します。compare − 配列要素の比較方法を指定します(省略可能)。指定できる値は以下のとおりです。SORT_STRING − 要素を文字列として比較しますSORT_REGULAR − 型を変換せずに通常の方法で要素を比較しますSORT_NUMERIC −

  2. PHPのarray_count_values()関数とは?配列内の値の出現回数を数える方法

    PHPのarray_count_values()関数は、配列内に各値が何回出現するかを集計し、その結果を連想配列として返す関数です。返される連想配列では、元の配列の「値」がキーとなり、その値が出現した「回数」が値として格納されます。 基本構文 array_count_values(array $array): array パラメータ array(必須)− 値の出現回数を集計したい対象の配列を指定します。 戻り値 array_count_values()関数は連想配列を返します。この連想配列のキーには元の配列の各値が、値にはそれぞれの出現回数が格納されます。なお、この関数で集計できるのは文字