3

double から小数部分を取得しようとしていますが、これは小数部分を取得するためのコードです

double  decimalvalue = 23423.1234-23423.0;
0.12340000000040163

しかし、減算後、decimalvalue は 0.1234 になると予想していますが、0.12340000000040163 になります。この動作を理解し、回避策があれば教えてください。

4

2 に答える 2

8

ご覧になることをお勧めします

すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと

ウィキペディア: IEEE 754

浮動小数点数で指定できる値の数は有限ですが、表現される範囲内の浮動小数点数は無限にあります。

したがって、一部の浮動小数点数は、浮動/倍精度形式のデータ型では正確に表すことができません。

特定の問題を処理する一般的な方法は、直接の等値比較を回避することですが、代わりにイプシロン テストを実行することです。期待値と計算値が互いにイプシロンと呼ばれる小さな数 (減算される値と比較して) 内にあるかどうかを確認します。 .

間接的に関連するのはMachine Epsilonの概念であり、完全に理解するために一見の価値があります

于 2012-10-02T23:43:45.380 に答える
3

これは丸め誤差です。基数 10 では、与えられた桁数 (たとえば 15) で 1/3 を完全に表すことはできません。基数 2 では、表現できないものがもっとたくさんあります。0.1234 はたまたまそのうちの 1 つです。精度はスケールによって異なりますが、double の場合は約 15 桁です。浮動小数点数の詳細については、 http://en.wikipedia.org/wiki/IEEE_floating_pointを参照することをお勧めします。

基数 10 のシステム (たとえば、人間が使用する電卓など) を作成しようとしていて、正確な結果が必要な場合は、BCD を使用する必要があります。

于 2012-10-02T23:42:42.143 に答える