質問

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

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

値の例を次に示します。

元の値: 18014398509481984

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

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

質問:

1 - 両方が同じである場合、2 番目の値が異なって見えるのはなぜですか?私は見えます 1984 になって 2000.

2 - 変換が起こるのはなぜですか?

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

助けていただければ幸いです。

役に立ちましたか?

解決

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

他のヒント

倍精度値は、10 進数 15 桁または 16 桁までしか正確ではありません (「 ここ 説明のために)。これを超える数を保存する必要がある場合は、別の数値形式を使用する必要があります。精度を損なうことなく非常に大きな整数を処理したい場合は、好みに合わせて役立つさまざまなクラスがあります。 これです.

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

これは浮動小数点の精度によるものだと思います (大きな数値には仮数と指数が使用されます)。つまり、基本的にべき乗を伴う分数として表現されることになります。ただし、小数の場合は浮動小数点演算により丸め誤差が発生します。

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

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

そうでない場合は、代わりに 64 ビット整数を使用できます。 BIGINT データベース内で、そして long/Int64 あなたのアプリで。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top