2011-12-21 145 views
1

我有一個應用程序計算值-1407.858; C#數據類型爲decimal插入SQL Server四捨五入問題

數據庫中的列數據類型是十進制(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 2011-12-21 16:57:42

+1

是的,當您將它放入一個帶兩位小數的變量中時,它會將值舍入爲兩位小數。 – Stu 2011-12-21 17:00:03

+0

@哈里,問題是......? :) – 2011-12-21 17:02:44

回答

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的價值來測試它嗎? – 2011-12-26 02:33:49

+0

謝謝,那就是我的想法也在哪裏。 – Harry 2012-01-03 10:10:28

+2

@AndriyM我嘗試了一些值,它們都被截斷,沒有被舍入(以任何形式)。 – Harry 2012-01-03 10:10:50

0

A decimal(12,2)可以存儲總共12位數字,其中兩個位於逗號後面。所以-1407.858四捨五入到-1407.85是正確的。

+0

我*認爲*問題是爲什麼它是TRUNCated而不是ROUNDed。但我能想到的最佳答案是「因爲它是」,或者「因爲文檔說它應該這樣做」。 – MatBailie 2011-12-21 17:09:28

+2

@Andomar,-1407.858的正確舍入值(作爲小數點(12,2))爲-1407.86。 – 2011-12-21 17:12:57

+0

@Dems如果答案只是「這就是文檔說它應該做的」 - 好極了;但它說的是什麼? – Harry 2011-12-21 17:18:36

2

我想SQL Server會在設置 時自動舍入值,但在插入時不會。它是否正確?

沒有。

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

返回-1407.86。我認爲截斷髮生在C#一側。