插入时的SQL Server舍入问题

时间:2011-12-21 16:56:27

标签: c# sql sql-server

我有一个计算值为-1407.858的应用程序; C#数据类型为decimal

数据库中的列数据类型是十进制(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 @first=@second

select @first;

我回到-1407.86,所以我认为SQL Server在设置它们时会自动舍入值,但在插入时不会。它是否正确? SQL Server是否仅在插入时截断,但在设置时为圆形?

3 个答案:

答案 0 :(得分:2)

  

我认为SQL Server会在设置时自动舍入值   它们,但不是在插入它们时。这是对的吗?

不。

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

返回-1407.86。我认为截断发生在C#侧的某个地方。

答案 1 :(得分:1)

我使用Linq2sql进行了测试,具体情况如下:

  • 使用int主键和小数(12,2)字段映射表;
  • 插入值为-12.585;
  • 的项目

执行SQL Profiler,我意识到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错误。在发送之前,您应该对数字进行舍入。

答案 2 :(得分:0)

decimal(12,2)总共可以存储12个数字,其中两个数字位于逗号后面。因此-1407.858四舍五入为-1407.85是正确的。