2011-12-21 89 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#一侧。