PHP_php の基本における不正確な浮動小数点計算、比較、丸めの解決策
May 16, 2016 am 09:00 AM浮動小数点計算結果の比較
浮動小数点計算の例は次のとおりです。
$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);
echo '
';
printf("%0.20f", $b);
出力結果は次のとおりです。
0.89999999999999991118
0.90000000000000002220
明らかに、ここでは浮動小数点データとして精度の一部が失われており、完全に正確であることはできません。したがって、浮動小数点数の結果が最後の桁まで正確であると決して信じないでください。また、2 つの浮動小数点数が等しいかどうかを比較しないでください。これは PHP の問題ではなく、コンピュータの内部浮動小数点数処理の問題であることに注意してください。 C や JAVA などの言語でも同じ問題が発生します。
したがって、2 つの浮動小数点数を比較するには、比較する前に必要な精度の範囲内で浮動小数点数を制御する必要があるため、bcadd() 関数を使用して浮動小数点数を加算し、精度を (文字列に) 変換します。 p>
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 桁を保持しても丸め結果には影響しません。

人気の記事

人気の記事

ホットな記事タグ

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











strconv.FormatFloat 関数を使用して浮動小数点数を文字列に変換します

C# で Math.Truncate 関数を使用して浮動小数点数を切り捨てる方法
