2011-12-21 15 views
1

-1407.858の値を計算するアプリケーションがあります。これのC#データ型はdecimalです。挿入時のSQL Server丸めの問題

データベースの列のデータ型は10進数(12,2)です。私はそれが値を丸めて-1407.86を挿入すると思っていたでしょう(ゼロ丸めと丸めの両方を満足させるでしょう)。

値は-1407.85として挿入されています。私がこれについて考えることができる唯一の説明は、最後の数字が切り捨てられているということです。

私は、次のようなSQL Server内のいくつかの簡単なテストクエリ行っている:

declare @first AS decimal(12,2) 
declare @second AS float --[or decimal(12,3)] 

set @second = -1407.858 
set @[email protected] 

select @first; 

をそして、私は戻って-1407.86を取得するので、私はそれらを挿入するとき、それはそれらを設定しますが、いないとき、SQL Serverは自動的に値を丸めたとします。これは正しいです? SQL Serverは挿入時にのみ切り捨てますが、設定時に丸めますか?

+7

ここで質問がありますか? – JNK

+1

はい、小数点以下2桁の変数に値を2つの小数点以下に丸めます。 – Stu

+0

@ハリーと質問は...? :) –

答えて

1

私は次のような状況で、Linq2sqlでテストをした:int型主キー、および小数点(12,2)フィールドを持つテーブルをマップされた

  • -12.585の値を持つ項目を挿入しました。 SQLプロファイラを実行

、私はlinq2sqlは、サーバーに次のステートメントを送信、値を切り捨てた実現:

exec sp_executesql N'INSERT INTO [dbo].[TestNumbers]([Id], [Number1]) 
VALUES (@p0, @p1)',N'@p0 int,@p1 decimal(12,2)',@p0=0,@p1=-12.58 

あなたがlinq2sqlのバグに直面しています。あなたはそれらを送信する前にあなたの番号を丸める必要があります。

+0

Linq2sqlが偶数丸めを使用していた可能性はありますか? OPの値でテストしましたか? –

+0

ありがとう、それは私の考えがあまりにも向かうところです。 – Harry

+2

@AndriyM私はいくつかの値を試してみましたが、丸められていない(すべての形式で)すべて切り捨てられました。 – Harry

0

decimal(12,2)は合計12桁を格納でき、そのうち2つはコンマの後ろにあります。したがって、-1407.858-1407.85に四捨五入されています。

+0

I * think *なぜTRUNCされ、ROUNDされていないのか?しかし、私が考えることができる最善の答えは、 "それがあるから"、あるいは "それは文書がそれがすべきことだから"ということなのかもしれません。 – MatBailie

+2

@Andomarの場合、-1407.858の正しい丸め値(小数点以下(12,2))は-1407.86です。 –

+0

@Dems答えが単に「それはドキュメントがそれがすべきことを言っていると言っている」場合です。しかし、それはどこで言いますか? – Harry

2

値を に設定すると、SQL Serverは値を自動的に丸めますが、挿入するときは値を丸めないとします。これは正しいです?

いいえ。

DECLARE @T TABLE(C DECIMAL(12,2)) 
INSERT INTO @T VALUES (-1407.858) 
SELECT * FROM @T 

返信-1407.86。私は切り詰めがC#のどこかで起こると推測します。