c/c++ 比较两个浮点数相等
PHP中文网
PHP中文网 2017-04-17 15:08:48
0
2
710
PHP中文网
PHP中文网

认证高级PHP讲师

全員に返信(2)
Ty80

まず、2 つの if は同じです。浮動小数点数を整数と比較する場合、整数は浮動小数点数に変換されます。
では、なぜ私は 10.0 に等しくないのでしょうか?これらの値とのみ等しいため:

リーリー

浮動小数点を 10 進数から 2 進数に変換する際にエラーがあることがわかります。エラーが 100 回累積すると、i は 9.99999999999998 に等しくなります。 (私は Python 3.6 を使用しています。浮動小数点数の 10 進表現は最も短い等価表現を使用します。また、C 言語と同じ内部表現を使用します。)

コンピュータでは浮動小数点数はバイナリ形式で表現および演算されます (通常、IEEE 754 標準を使用します)。0.1 はバイナリでは正確に表現できません (循環小数です。分母に 2 の因数のみが含まれる小数のみが使用可能です)。バイナリで表現されます。それまで循環しません)。このようにエラーが発生します。誤差が蓄積すると、10 進法からどんどん逸脱していきます。

等しいかどうかを比較する必要がある場合は、指定した数値との差を見つけることができます (Python の math.isclose 関数など) 差が特定の値より小さい場合、等しいと見なされます。

正確な値が必要な場合 (1 ペニーも少ない財務計算を行う場合など)、いわゆる「10 進数」を使用して演算を実行できます (10 進数、Python と Ruby の両方でサポートされています。 mpDecimal ライブラリも使用します)、精度を指定するか (mpfr ライブラリを使用するなど)、固定小数点数を使用します。

いいねを押す +0
小葫芦

强数据类型 の言語については、double float のように小数点を含むデータを比較する場合、一般的に == は比較に使用されません。

代わりに、2 つの数値の減算の絶対値を比較します。絶対値が小さい値より小さい場合、2 つの浮動小数点数は等しいと見なされます。

次のコード:

リーリー

これが起こる理由は、コンピューター自体がデータを表すために 01 バイナリを使用しているためです。

基本的には次のように理解できます。

コンピュータ内部の浮動小数点数の保存形式により、メモリに保存される浮動小数点数の多くは、できるだけ近い形式でのみ保存されます

ご興味がございましたら、さらに詳しくご覧ください。

ブログガーデンの記事

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート