double から小数部分を取得しようとしていますが、これは小数部分を取得するためのコードです
double decimalvalue = 23423.1234-23423.0;
0.12340000000040163
しかし、減算後、decimalvalue は 0.1234 になると予想していますが、0.12340000000040163 になります。この動作を理解し、回避策があれば教えてください。
double から小数部分を取得しようとしていますが、これは小数部分を取得するためのコードです
double decimalvalue = 23423.1234-23423.0;
0.12340000000040163
しかし、減算後、decimalvalue は 0.1234 になると予想していますが、0.12340000000040163 になります。この動作を理解し、回避策があれば教えてください。
ご覧になることをお勧めします
すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと
浮動小数点数で指定できる値の数は有限ですが、表現される範囲内の浮動小数点数は無限にあります。
したがって、一部の浮動小数点数は、浮動/倍精度形式のデータ型では正確に表すことができません。
特定の問題を処理する一般的な方法は、直接の等値比較を回避することですが、代わりにイプシロン テストを実行することです。期待値と計算値が互いにイプシロンと呼ばれる小さな数 (減算される値と比較して) 内にあるかどうかを確認します。 .
間接的に関連するのはMachine Epsilonの概念であり、完全に理解するために一見の価値があります
これは丸め誤差です。基数 10 では、与えられた桁数 (たとえば 15) で 1/3 を完全に表すことはできません。基数 2 では、表現できないものがもっとたくさんあります。0.1234 はたまたまそのうちの 1 つです。精度はスケールによって異なりますが、double の場合は約 15 桁です。浮動小数点数の詳細については、 http://en.wikipedia.org/wiki/IEEE_floating_pointを参照することをお勧めします。
基数 10 のシステム (たとえば、人間が使用する電卓など) を作成しようとしていて、正確な結果が必要な場合は、BCD を使用する必要があります。