浮動小数点型 (浮動小数点数 float、倍精度数値 double、または実数 real とも呼ばれます) は、次の構文のいずれかで定義できます:
<?php $a = 1.234; $b = 1.2e3; $c = 7E-10; ?>
浮動小数点数の形式で表されます:
LNUM [0-9 ]+
DNUM ([0 -9]*[.]{LNUM}) ({LNUM}[.][0-9]*)
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-] ? {LNUM})
浮動小数点数の語長はプラットフォームに依存しますが、通常、最大値は 10 進数 14 桁 (64 ビット IEEE 形式) の精度で 1.8e308 です。
警告
浮動小数点数の精度
浮動小数点数の精度には限界があります。システムにもよりますが、PHP は通常 IEEE 754 double 形式を使用するため、丸めによる最大相対誤差は 1.11e-16 です。非基本的な数学演算ではより大きな誤差が生じる可能性があるため、複合演算を実行する場合は誤差の伝播を考慮する必要があります。
また、10進数で正確に表現できる0.1や0.7などの有理数は、仮数部がいくらあっても、内部で使用するバイナリでは正確に表現できないため、多少の劣化をせずにバイナリ形式に変換することはできません。ちょっとした精度。これは、混乱を招く結果につながる可能性があります。たとえば、floor((0.1+0.7)*10) は、結果の内部表現が 7.9999999999999991118... のようなものであるため、通常、期待される 8 ではなく 7 を返します。
したがって、浮動小数点数の結果が最後の桁まで正確であるとは決して信じないでください。また、2 つの浮動小数点数が等しいかどうかを比較しないでください。本当に高い精度が必要な場合は、任意精度の数学関数または gmp 関数を使用する必要があります。
簡単な説明については、「浮動小数点ガイド」Web ページを参照してください。
浮動小数点数への変換
文字列を浮動小数点数に変換するタイミングと方法について知りたい場合は、「文字列を数値に変換する」セクションを参照してください。他のタイプの値の場合、状況は値を整数に変換してから浮動小数点に変換する場合と似ています。詳細については、「整数への変換」セクションを参照してください。 PHP 5 では、オブジェクトを浮動小数点数に変換しようとすると、E_NOTICE エラー メッセージが発行されます。
浮動小数点数の比較
上記の警告メッセージにあるように、内部式の理由により、2 つの浮動小数点数が等しいかどうかを比較する際に問題があります。ただし、浮動小数点値を比較する回りくどい方法があります。
浮動小数点数が等しいかどうかをテストするには、その値よりほんの少しだけ大きい最小誤差値を使用します。この値は、マシン イプシロンまたは最小単位整数とも呼ばれ、計算で受け入れられる最小の差の値です。
$a と $b は小数点以下 5 桁の精度に相当します。
<?php $a = 1.23456789; $b = 1.23456780; $epsilon = 0.00001; if(abs($a-$b) < $epsilon) { echo "true"; } ?>
NaN
特定の数学演算は、定数 NAN で表される結果を生成します。この結果は、未定義または浮動小数点演算で表現できない値を表します。この値と他の値との緩い比較または厳密な比較の結果は FALSE になります。
NAN は異なる値を表すため、NAN はそれ自体を含む他の値と比較されるべきではなく、is_nan() を使用してチェックされる必要があります。