Convert.ToDoubleはゼロを追加し、この絵のように1されていない与えている:倍増する変換すると、正確な数
それは21.620000000000001に21.62から回しているのはなぜ? これは浮動小数点の問題ですか?
Convert.ToDoubleはゼロを追加し、この絵のように1されていない与えている:倍増する変換すると、正確な数
それは21.620000000000001に21.62から回しているのはなぜ? これは浮動小数点の問題ですか?
Double(およびFloat)はfloating-pointタイプであり、バイナリシステムでは不正確です。
より正確な比較が必要な場合は、代わりにdecimal
を使用してください。計算しているだけなら、double
はうまくいくはずです。絶対平等のために倍を比較する必要がある場合は、その差の絶対値をある小さな定数と比較してください:
if (a == b) // not reliable for floating point
{
....
}
double EPSILON = 0.0000001;
if (Math.Abs(a-b) < EPSILON)
{
....
}
http://msdn.microsoft.com/en-us/library/system.double.epsilon.aspx –
'System.Double.Epsilon'の使用を提案している場合は、2つの倍音の差が(MSDNから)2つの浮動小数点数が等しいとみなせるかどうかを判断するカスタムアルゴリズムを作成する場合は、Epsilon定数より大きい値を使用して、 2つの値が等しいとみなされる。 (典型的には、差のマージンはイプシロンよりも何倍も大きい)。 –
このような丸め誤差は、ほとんどすべての高レベルプログラミング言語で共通しています。 Javaでは、精度を保証する必要がある場合は、BigDecimalというクラスを使用します。それ以外の場合は、必要な最も近い場所に小数点以下を四捨五入するメソッドを書くことができます。
落札者はコメントする必要があります。これは悪い答えのようには見えません。 – Yuck
まあ、私はC#の特定の答えを与えていないとちょうど "ライブラリのクラスを探して行く"と言いましたが、これは私が推測する最大ではありません:/ – thatidiotguy
私はdownvoteしなかったが、本当に言語によって決まる。言語では「IEEE doubleは使用できるデータ型の1つです」と書かれています。この振る舞いは、IEEEによって実際に指定されます。 – phoog
要するに、はい、任意の2つの基底(この場合は2と10)の間には、常に他のものには存在しない有限個の "十進数"(binimal?)の場所で表現できる値があります。
実際には、それが真実であるためには、基底は互いに素でなければなりません。基底2の有限数の場所を持つ分数は、基底4,8,16などに有限数の場所を持ち、その逆もあります。 – phoog
素敵な呼び出し;それが私が数学者であるふりをする理由です。 –
浮動小数点数には近似の問題があります。 これは、0,00001のような小数部分は、バイナリシステム(小数はモジュールq/pで表されます)では正確に表現できないためです。 問題は本質的です。
はい、浮動小数点の問題です。 –
@ uzay95これは浮動小数点の問題ですか?はい、そうです。 –
写真は間違いなく役立ちますが、問題のコードをテキストで表現した写真を添付するといいでしょう。 – JaredPar