

c#のプログラムでdouble型変数を用いて演算を行い、SQL serverのnumeric(12,3)の型のカラムに登録したら0になってしまいました。

実際の演算式は下記で999999999.999-999999999.998  
答えは0.001となっています。

この答えをオラクルnumber(12,3)に登録すると0.001になりましたがSQL serverに登録したら0になってしまったのです。

登録時のパラメーターのマッピング方法がが間違っているのでしょうか。


CC BY-SA 4.0
2020-02-04T12:56:25.003
62773
2020-02-11T09:43:58.637
2020-02-04T13:52:38.593
9228
9228
question
c# sql-server
SQL serverのnumeric型に小数を登録すると0になる


[SQL Serverのnumeric型](https://docs.microsoft.com/ja-jp/sql/t-sql/data-
types/decimal-and-numeric-transact-sql?view=sql-server-
ver15)は精度を指定しなかった場合、`numeric(18,0)`となります。scale=0ですので整数しか扱えません。たぶんこれが原因です。

質問文にはC#からSQL
Serverにどのような方法でデータを渡したのかが言及されていませんが、渡す際に精度が指定されていなかったのだろうと推測します。例えばC#の`decimal`（.NETの`System.Decimal`）を精度ヒント無しで自動変換した、とか。


CC BY-SA 4.0
2020-02-04T14:48:08.573
62777
2020-02-04T14:48:08.573
4236
62773
answer


double型での計算結果が0.001未満になっていたことが原因のようです。  
オラクルではその結果を0.001で登録してくれますが、SQL serverでは、0.000で切り捨てて登録されました。

演算の際、一度decimal型で計算し、その結果を登録することで解決できました。


CC BY-SA 4.0
2020-02-11T09:43:58.637
62959
2020-02-11T09:43:58.637
9228
62773
answer