ホームページ  >  記事  >  バックエンド開発  >  PHP における不正確な浮動小数点計算の比較と丸め、不正確な丸めの解決策_PHP チュートリアル

PHP における不正確な浮動小数点計算の比較と丸め、不正確な丸めの解決策_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:10:011093ブラウズ

PHPにおける不正確な浮動小数点計算の比較と丸め、不正確な丸めの解決策

浮動小数点演算結果の比較
浮動小数点計算の例は次のとおりです:

コードをコピーします コードは次のとおりです:

$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… となります。

上記の変数を倍精度形式で出力します。

コードをコピーします コードは次のとおりです:

$a = 0.2+0.7;
$b = 0.9;
printf("%0.20f", $a);
エコー '
';
printf("%0.20f", $b);

出力結果は以下の通りです:

コードをコピーします コードは次のとおりです:

0.89999999999999991118
0.90000000000000002220

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

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

コードをコピーします コードは次のとおりです:
var_dump(bcadd(0.2,0.7,1) == 0.9); // 出力: bool(true)

浮動小数点数の丸め

「PHP 丸め関数 ceil と Floor」の記事には例があります:

コードをコピーします コードは次のとおりです:
echo ceil(2.1/0.7); // 出力: 4
?>

浮動小数点数の計算に関する上記の議論の後、これは浮動小数点数の計算結果の不完全な精度が原因であることがわかります。

コードをコピーします コードは次のとおりです:
printf("%0.20f", (2.1/0.7)); // 出力: 3.00000000000000044409
?>


浮動小数点数の計算に関する上記の議論の後、これは不正確な浮動小数点数の計算結果によって引き起こされることがわかったので、round() 関数を使用してそれに対処できます。

コードをコピーします

コードは次のとおりです: echo ceil(round((2.1/0.7),1) );
?>



round() 関数は指定された精度に従って丸めますが、小数点以下 1 桁を保持しても丸め結果には影響しません。

http://www.bkjia.com/PHPjc/940487.html

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/940487.html技術記事 PHP における不正確な浮動小数点数計算の比較と丸めの解決方法 不正確な丸めを伴う浮動小数点数計算結果の比較の例は次のとおりです。 $a = 0.2+... のコードをコピーします。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。