认证高级PHP讲师
まず、2 つの if は同じです。浮動小数点数を整数と比較する場合、整数は浮動小数点数に変換されます。 では、なぜ私は 10.0 に等しくないのでしょうか?これらの値とのみ等しいため:
浮動小数点を 10 進数から 2 進数に変換する際にエラーがあることがわかります。エラーが 100 回累積すると、i は 9.99999999999998 に等しくなります。 (私は Python 3.6 を使用しています。浮動小数点数の 10 進表現は最も短い等価表現を使用します。また、C 言語と同じ内部表現を使用します。)
コンピュータでは浮動小数点数はバイナリ形式で表現および演算されます (通常、IEEE 754 標準を使用します)。0.1 はバイナリでは正確に表現できません (循環小数です。分母に 2 の因数のみが含まれる小数のみが使用可能です)。バイナリで表現されます。それまで循環しません)。このようにエラーが発生します。誤差が蓄積すると、10 進法からどんどん逸脱していきます。
等しいかどうかを比較する必要がある場合は、指定した数値との差を見つけることができます (Python の math.isclose 関数など) 差が特定の値より小さい場合、等しいと見なされます。
math.isclose
正確な値が必要な場合 (1 ペニーも少ない財務計算を行う場合など)、いわゆる「10 進数」を使用して演算を実行できます (10 進数、Python と Ruby の両方でサポートされています。 mpDecimal ライブラリも使用します)、精度を指定するか (mpfr ライブラリを使用するなど)、固定小数点数を使用します。
强数据类型 の言語については、double float のように小数点を含むデータを比較する場合、一般的に == は比較に使用されません。
强数据类型
double
float
==
代わりに、2 つの数値の減算の絶対値を比較します。絶対値が小さい値より小さい場合、2 つの浮動小数点数は等しいと見なされます。
リーリー
基本的には次のように理解できます。
ご興味がございましたら、さらに詳しくご覧ください。
まず、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 ライブラリを使用するなど)、固定小数点数を使用します。
强数据类型
の言語については、double
float
のように小数点を含むデータを比較する場合、一般的に==
は比較に使用されません。代わりに、2 つの数値の減算の絶対値を比較します。絶対値が小さい値より小さい場合、2 つの浮動小数点数は等しいと見なされます。
次のコード:リーリー
これが起こる理由は、コンピューター自体がデータを表すために 01 バイナリを使用しているためです。基本的には次のように理解できます。
コンピュータ内部の浮動小数点数の保存形式により、メモリに保存される浮動小数点数の多くは、できるだけ近い形式でのみ保存されますご興味がございましたら、さらに詳しくご覧ください。
ブログガーデンの記事