2

ここで奇妙な問題が発生しています。列に巨大な値が格納されているデータベース テーブルがあります。私のアプリケーション (C#) は、この値を読み取り、double型に保持しています。このアプリケーションは、同じ値を別のテーブルに挿入します。注:最初のテーブルから読み取った値に対して計算/処理を行っていません。2 番目のテーブルを更新するために保持されます。

ここでの問題は、2 番目のテーブルが最初のテーブルとはわずかに異なる値を取得していることです。double型にしておくと数字が四捨五入されているようです。

値の例を次に示します。

元の値: 18014398509481984

新しいテーブルにコピーされた値: 18014398509482000

値は異なって見えますが、実際には両方とも同じです。検索語として18014398509481984 - 18014398509482000を使用して Google 検索を行ったところ、結果0が返されました。これは、両方が同じであることを意味します。

質問:

1 - 両方が同じ場合、2 番目の値が異なって見えるのはなぜですか? 1984 年が2000年に変わったことがわかります。

2 - コンバージョンが発生する理由

3 - この種の変換を回避するにはどうすればよいですか?

どんな助けでも素晴らしいでしょう!

4

4 に答える 4

5

System.Decimalの代わりに を使用して、最初のテーブルの値を格納してみてくださいSystem.DoubleSystem.Doubleその大きな値を正確に格納するのに十分な有効桁数が含まれていないようです。

于 2009-07-16T14:40:17.000 に答える
3

倍精度値は、10 進数で 15 桁または 16 桁までしか正確ではありません (説明については、こちらを参照してください)。これより多くを格納する必要がある場合は、別の数値形式を使用する必要があります。精度を落とさずに非常に大きな整数を処理したい場合は、さまざまなクラスが用意されており、このクラスを気に入るはずです。

SQL から値を取得する場合は、.NET のターゲット データ型が一致していることを確認してください (たとえば、C# long の場合は SQL bigint)。これにより、このような丸めの問題が回避されます。

于 2009-07-16T14:38:34.677 に答える
2

これは浮動小数点の精度によるものだと思います(大きな数は仮数と指数を使用します)。これは、基本的に累乗のある小数として表されることを意味します。ただし、小数では、浮動小数点演算による丸め誤差が発生します。

通常、これを回避する方法は、浮動小数点値を回避し (Int64 を試す)、より正確な型 (Decimal) を使用するか、エラーを考慮して「近似に等しい」を実行することです。

于 2009-07-16T14:38:56.283 に答える
2

これらを浮動小数点数として保存する必要がありますか?

そうでない場合は、代わりに 64 ビット整数を使用できます:BIGINTデータベースで、およびlong/Int64アプリで。

これらの範囲は –9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 までで、精度/精度の問題はありません。

于 2009-07-16T14:44:10.843 に答える