2010-12-06 9 views
0

金額を格納しており、グリッドビューに表示されているデータベースがあります。私は3,594,879.59として入力されている金額を持っていると私はgridviewを見て私は3,594,880.00を得ています。フロートとして鋳造されたマネーは精度を丸める

SQL Moneyの種類は、既定のMoneyであり、Moneyの種類をカスタマイズするためのテーブルを作成するときにSQLで何も行われませんでした。 Linqでは、金額をフロートにキャストしていますか?

何が起こっているのですか?大きな数字でしか起こっていません(例えば、私は1.5にdbを入れ、1.5はグリッドビューで表示します)。

答えて

1

宛先が標準の32ビット浮動小数点数の場合、正確に何を取得する必要がありますか。それをお金のままにしておくか、スケーリングされた整数または倍精度(64ビット)の浮動小数点に変更してください。

32ビット浮動小数点数は、6から7の有効数字の有効数字を持ちます。 64ビットの浮動小数点数は、16桁未満の精度しかありません。

+0

Er ... no。申し訳ありませんが、これは間違っています。それは意見の問題ではなく、それは間違っているだけです。 base-10表現を使用し、基数2の近似のために丸め誤差を発生させないため、.NETアプリケーションでの金額表現に小数 - 浮動小数点または二重ではなく - を使用します。 –

2

SQLマネータイプをCLRタイプの小数点にキャストします。 Decimalは、基数10の内部表現を使用する浮動小数点数値型であるため、近似なしの範囲内の任意の10進数を表すことができます。

これはfloatよりも遅く、精度の面では取引範囲ですが、お金に関係するものについては、小数点以下を使用して近似誤差を避けてください。

編集:「なぜこれが起こったのか」 - 理由は2つあります。第1に、浮動小数点数は、小数部分を正確に表現することが不可能な、基数2の内部表現を使用します。第2に、浮動小数点数が浮動小数点と呼ばれる理由は、整数部分に固定精度を使用し、小数部分に固定精度を使用する代わりに、絶対値と精度の間で絶え間のトレードオフを提供するということです。整数部分が比較的小さい数(1.5のように)は、内部表現の大部分を小数部分に割り当てることができるため、はるかに高い精度を提供します。積分部分の大きさが増加するにつれて、これまでは精度のために使用されていたビットがより大きな整数値を記憶するために必要となり、したがって、小数部分の精度が損なわれる。

非常に、非常に粗雑、それは10桁の数字を持っているようなものです、あなたが好きな場所に小さい値のために、あなたは非常に正確な画分を表すことができるようにあなたは、小数点を置くことができます。

1.000000

が、より大きな値のためにあなたは、この実際作品は、IEEE 754標準をチェックアウトする方法の詳細について

1234567890.2 

:利用できるほぼそんなに小数の精度を持っていません。

関連する問題