2009-08-17 9 views
2

私は、コードは次のようになりますジェネリック型Tに(私は、データベースから取得)Objectから変換するにはConvert.ChangeTypeを()を使用しています:C Convert.ChangeTypeを(使用して#間違って変換)

T element = (T)Convert.ChangeType(obj, typeof(T)); 
return element; 

これはほとんどの時間は、しかし、私は、次のSQLクエリ

select 3.2 

上記のコードは(Tは、二重である)のリターンのような単純なものをキャストしようとすると文句3.2を返すことを発見した素晴らしい作品が、3.2000000000000002 。なぜこれが起きているのか、それをどう修正するのか分かりません。助けてください!

答えて

7

あなたが見ているのは、浮動小数点数がメモリ内に表現される方法の成果物です。なぜこれが正確であるかについてはかなりの情報がありますが、this paperは良いものです。この現象は、あなたが一見異常な行動に終わることができる理由です。 doubleまたはsingleは、フォーマットされていないユーザーに決して表示されるべきではなく、ペストのような等価比較を避けるべきです。

精度がより高い数値(通貨の値を表す数値)が必要な場合は、decimalを使用します。

2

Convertの問題ではありません。内部的にdouble型は、実数の2の無限小数部として表現されるため、そのような結果が得られます。あなたの目的での使用に依存:

  • どちらの進
  • 性または正確な整形{0:F2}使用
  • 使用Math.Flor/Math.Ceil
関連する問題