2 つの整数からの単純な除算に問題があります。できるだけ正確にする必要がありますが、何らかの理由で double 型の動作がおかしくなります。
たとえば、次のコードを実行するとします。
double res = (29970.0/1000.0);
結果は 29.969999999999999 ですが、本来は 29.970 です。
なぜこれが起こっているのですか?
ありがとう
2 つの整数からの単純な除算に問題があります。できるだけ正確にする必要がありますが、何らかの理由で double 型の動作がおかしくなります。
たとえば、次のコードを実行するとします。
double res = (29970.0/1000.0);
結果は 29.969999999999999 ですが、本来は 29.970 です。
なぜこれが起こっているのですか?
ありがとう
できるだけ正確にする必要があります
では、s を使用しないでくださいdouble
。たとえば、Java ではBigDecimal
代わりに を使用します (ほとんどの言語で同様の機能が提供されています)。double
操作は本質的にある程度不正確です。これは、浮動小数点数の内部表現によるものです。
なぜこれが起こっているのですか?
二重表現は有限だからです。たとえば、IEEE754 の倍精度規格では、小数部は 52 ビットです。したがって、すべての実数がカバーされているわけではありません。そのため、一部の値は理想的に正確ではありません。あなたの場合、結果は理想から 10^-15 離れています。
できるだけ正確にする必要があります
特効薬はありませんが、基本的な算術演算 (ℚ を ℚ にマップする) のみが必要で、正確な結果が本当に必要な場合は、2 つの無制限の整数 (別名 BigInteger、BigInt など) で構成される有理型が最善の策です。 - しかし、それでも記憶は無限ではなく、考えなければなりません。
残りの質問については、固定サイズの浮動小数点数について読んでください。良いソースがたくさんあります。