2012-01-27 9 views
-2

Convert.ToDoubleはゼロを追加し、この絵のように1されていない与えている:倍増する変換すると、正確な数

enter image description here

それは21.620000000000001に21.62から回しているのはなぜ? これは浮動小数点の問題ですか?

+2

はい、浮動小数点の問題です。 –

+0

@ uzay95これは浮動小数点の問題ですか?はい、そうです。 –

+2

写真は間違いなく役立ちますが、問題のコードをテキストで表現した写真を添付するといいでしょう。 – JaredPar

答えて

4

Double(およびFloat)はfloating-pointタイプであり、バイナリシステムでは不正確です。

より正確な比較が必要な場合は、代わりにdecimalを使用してください。計算しているだけなら、doubleはうまくいくはずです。絶対平等のために倍を比較する必要がある場合は、その差の絶対値をある小さな定数と比較してください:

if (a == b) // not reliable for floating point 
{ 
    .... 
} 

double EPSILON = 0.0000001; 
if (Math.Abs(a-b) < EPSILON) 
{ 
    .... 
} 
+0

http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx –

+1

'System.Double.Epsilon'の使用を提案している場合は、2つの倍音の差が(MSDNから)2つの浮動小数点数が等しいとみなせるかどうかを判断するカスタムアルゴリズムを作成する場合は、Epsilon定数より大きい値を使用して、 2つの値が等しいとみなされる。 (典型的には、差のマージンはイプシロンよりも何倍も大きい)。 –

0

このような丸め誤差は、ほとんどすべての高レベルプログラミング言語で共通しています。 Javaでは、精度を保証する必要がある場合は、BigDecimalというクラスを使用します。それ以外の場合は、必要な最も近い場所に小数点以下を四捨五入するメソッドを書くことができます。

+0

落札者はコメントする必要があります。これは悪い答えのようには見えません。 – Yuck

+0

まあ、私はC#の特定の答えを与えていないとちょうど "ライブラリのクラスを探して行く"と言いましたが、これは私が推測する最大ではありません:/ – thatidiotguy

+0

私はdownvoteしなかったが、本当に言語によって決まる。言語では「IEEE doubleは使用できるデータ型の1つです」と書かれています。この振る舞いは、IEEEによって実際に指定されます。 – phoog

2

要するに、はい、任意の2つの基底(この場合は2と10)の間には、常に他のものには存在しない有限個の "十進数"(binimal?)の場所で表現できる値があります。

+0

実際には、それが真実であるためには、基底は互いに素でなければなりません。基底2の有限数の場所を持つ分数は、基底4,8,16などに有限数の場所を持ち、その逆もあります。 – phoog

+0

素敵な呼び出し;それが私が数学者であるふりをする理由です。 –

3

浮動小数点数には近似の問題があります。 これは、0,00001のような小数部分は、バイナリシステム(小数はモジュールq/pで表されます)では正確に表現できないためです。 問題は本質的です。

関連する問題