ホームページ >バックエンド開発 >PHPの問題 >PHP 浮動小数点減算が 0 に等しくない

PHP 浮動小数点減算が 0 に等しくない

angryTom
angryTomオリジナル
2019-10-26 17:42:203587ブラウズ

PHP 浮動小数点減算が 0 に等しくない

#php 浮動小数点減算は 0 に等しくありません

php 浮動小数点減算は 0 に等しくありません。 10 進数を 2 進数に変換すると精度が失われるため、bcadd() 関数を使用して浮動小数点数の加減算を行い、精度の変換を実行できます。

さらに、浮動小数点数が 0 に等しいかどうかを判断するには、$num == 0 ではなく、

abs($d) < EPS を使用します。この EPS は非常に小さな値。

浮動小数点データとして、精度の一部が失われており、完全に正確であることはできません。したがって、浮動小数点数の結果が最後の桁まで正確であると決して信じないでください。また、2 つの浮動小数点数が等しいかどうかを比較しないでください。これは PHP の問題ではなく、コンピュータの内部浮動小数点数処理の問題であることに注意してください。 C や JAVA などの言語でも同じ問題が発生します。

浮動小数点数の計算の例は次のとおりです。

$a = 0.2+0.7;
$b = 0.9;
var_dump($a == $b);

出力される結果は次のとおりです: bool(false)。つまり、ここでの 0.2 0.7 という計算結果は 0.9 と等しくなく、明らかに常識に反しています。

この問題に関して、公式の PHP マニュアルには次のように書かれていました: どうやら、0.2 のような単純な小数は、精度を少し損なうことなく内部バイナリ形式に変換できないようです。これは、有限の桁数で特定の小数を正確に表現することが不可能であるという事実と関係しています。たとえば、10 進数の 1/3 は 0.3333333… となります。

したがって、2 つの浮動小数点数を比較するには、比較する前に必要な精度の範囲内で浮動小数点数を制御する必要があるため、bcadd() 関数を使用して浮動小数点数を加算し、精度を (文字列に) 変換します。 :

var_dump(bcadd(0.2,0.7,1) == 0.9); // 输出:bool(true)

PHP 関連の知識については、

PHP 中国語 Web サイト をご覧ください。

以上がPHP 浮動小数点減算が 0 に等しくないの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。