PHP (ハイパーテキスト プリプロセッサ) は、動的 Web 開発によく使用される、人気のあるオープン ソースのサーバー側プログラミング言語です。
PHP では、float は、3.14 などの小数部分を含む数値を表すために使用されるデータ型です。ただし、一部の PHP 開発者は、float を使用すると不正確さが発生することを発見しました。
この記事では、PHP float が不正確な理由と float を正しく使用する方法について説明します。
1. float が許可されない理由
コンピュータでは、限られた長さの数値しか表現できないため、浮動小数点数は制限されています。したがって、浮動小数点数を計算に使用すると、不正確さが発生する可能性があります。
たとえば、PHP では、次のコード:
$a = 0.1; $b = 0.2; $c = $a + $b; echo $c;
期待される出力は 0.3 ですが、実際の出力は 0.30000000000000004 です。
これは、コンピュータ内では 0.1 と 0.2 は無限大であり、正確に表現できないためです。 0.1 0.2 を計算する場合、コンピューターは 2 つの無限の数を加算し、結果をいくつかの近似を使用して表現する必要があるため、結果が不正確になります。
2. 不正確な float を回避する方法
float は不正確ですが、シナリオによっては使用する必要があります。このとき、開発者は不正確さをできるだけ避けるために次の点に注意する必要があります:
1. float の直接比較を避ける
float は表現が異なる場合があるため、float を直接比較します。予期しない結果が生じる可能性があります。
例:
$a = 0.1; $b = 0.2; $c = 0.3; if ($a + $b == $c) { echo "equals"; } else { echo "not equals"; }
$a $b の結果が $c の結果と正確に等しくないため、このコードの出力結果は「等しくない」となります。
比較する必要がある場合は、次のメソッドを使用できます:
$epsilon = 0.00001; if (abs($a+$b-$c) < $epsilon) { echo "equals"; } else { echo "not equals"; }
この方法では、「フォールト トレランス値」を使用して、2 つの float が等しいかどうかを判断できます。
2.round 関数を使用する
round 関数は、float を指定された小数点以下の桁数に丸めることができます。これにより、フロートの不正確さの問題をある程度修正できます。
例:
$a = 0.1; $b = 0.2; $c = $a + $b; echo round($c, 1); //输出0.3
3. 浮動小数点の代わりに整数を使用する
正確な計算が必要な場合は、浮動小数点の代わりに整数を使用できます。たとえば、通貨値をセントに変換し、整数を使用して計算を実行し、結果をドルに変換できます。
$price = 2.68; //2.68元 $price_in_cents = intval($price * 100); //268分 $discount = 20; //20% $final_price_in_cents = $price_in_cents * (100 - $discount) / 100; $final_price = number_format($final_price_in_cents / 100, 2); //最终价格,2位小数
これにより、計算に float を使用する場合の不正確さを回避できます。
3. 概要
PHP では、コンピューターは無限長の数値を正確に表現できないため、float は不正確です。 float の不正確さの影響を回避するために、次の措置を講じることができます:
1. float の直接比較を避け、フォールト トレランス値を使用して 2 つの float が等しいかどうかを判断します;
2. を使用します。浮動小数点を指定された小数点以下の桁数に四捨五入するラウンド関数;
3. 正確に計算するには、浮動小数点の代わりに整数を使用します。
もちろん、float を使用する場合は、プログラムの精度を確保するために複数の状況を考慮し、それらを適切に処理する必要があります。
以上がPHP float が不正確な理由とそれを回避する方法について説明します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。