0

2 つの整数からの単純な除算に問題があります。できるだけ正確にする必要がありますが、何らかの理由で double 型の動作がおかしくなります。

たとえば、次のコードを実行するとします。

double res = (29970.0/1000.0); 

結果は 29.969999999999999 ですが、本来は 29.970 です。

なぜこれが起こっているのですか?

ありがとう

4

4 に答える 4

2

できるだけ正確にする必要があります

では、s を使用しないでくださいdouble。たとえば、Java ではBigDecimal代わりに を使用します (ほとんどの言語で同様の機能が提供されています)。double操作は本質的にある程度不正確です。これは、浮動小数点数の内部表現によるものです。

于 2013-07-23T17:22:10.550 に答える
2

なぜこれが起こっているのですか?

二重表現は有限だからです。たとえば、IEEE754 の倍精度規格では、小数部は 52 ビットです。したがって、すべての実数がカバーされているわけではありません。そのため、一部の値は理想的に正確ではありません。あなたの場合、結果は理想から 10^-15 離れています。

于 2013-07-23T17:25:04.317 に答える
0

できるだけ正確にする必要があります

特効薬はありませんが、基本的な算術演算 (ℚ を ℚ にマップする) のみが必要で、正確な結果が本当に必要な場合は、2 つの無制限の整数 (別名 BigInteger、BigInt など) で構成される有理型が最善の策です。 - しかし、それでも記憶は無限ではなく、考えなければなりません。

残りの質問については、固定サイズの浮動小数点数について読んでください。良いソースがたくさんあります。

于 2013-07-23T17:37:49.703 に答える