質問
ここで奇妙な問題が発生しています。列に巨大な値が格納されているデータベーステーブルがあります。私のアプリケーション (C#) はこの値を読み取り、 ダブル タイプ。このアプリケーションは、同じ値を別のテーブルに挿入します。注記 :最初のテーブルから読み取られた値に対して計算や処理は行っていません。これは、2 番目のテーブルを更新するために保持されているだけです。
ここでの問題は、2 番目のテーブルが最初のテーブルとはわずかに異なる値を取得していることです。double型のままだと数値が四捨五入されてしまうようです。
値の例を次に示します。
元の値: 18014398509481984
新しいテーブルにコピーされた値: 18014398509482000
値は異なって見えますが、実際には両方とも同じです。私はGoogle検索をしました 18014398509481984 - 18014398509482000 検索語として入力すると結果が返されました 0, 、これは両方が同じであることを意味します。
質問:
1 - 両方が同じである場合、2 番目の値が異なって見えるのはなぜですか?私は見えます 1984 になって 2000.
2 - 変換が起こるのはなぜですか?
3 - この種の変換を回避するにはどうすればよいですか?
助けていただければ幸いです。
解決
を使用してみてください System.Decimal
の代わりに最初のテーブルの値を保存するには System.Double
. System.Double
これほど大きな値を正確に格納するのに十分な有効数字が含まれていないようです。
他のヒント
これは浮動小数点の精度によるものだと思います (大きな数値には仮数と指数が使用されます)。つまり、基本的にべき乗を伴う分数として表現されることになります。ただし、小数の場合は浮動小数点演算により丸め誤差が発生します。
通常、これを回避する方法は、浮動小数点値を回避し (Int64 を試してください)、より正確な型 (Decimal) を使用するか、エラーを考慮して「ほぼ等しい」を実行することです。