C# 插入时SQL Server舍入问题

C# 插入时SQL Server舍入问题,c#,sql,sql-server,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

我有一个计算值为-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是否仅在插入时截断,而在设置时舍入?

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

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

没有


返回
-1407.86
。我假定截断发生在
C#
端的某个地方。

我使用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错误。发送数字之前,您应该先将数字四舍五入。

这里的问题是什么?是的,当您将数字放入一个带有两个小数的变量中时,它会将值四舍五入为两个小数。@Harry,问题是……?:)@Harry,你是如何插入这个值的?您正在使用linq2sql、ef或任何数据框架吗?不要费心“对抗”它,在插入结果之前对结果使用ROUND函数。这样你就可以使用你选择的方法显式地取整。我想问题是为什么它被截断而不是取整。但是我能想到的最好的答案是“因为它是”,或者可能是“因为文档说它应该这样做”。@Andomar,-1407.858的正确四舍五入值(作为小数点(12,2))是-1407.86。@Dems如果答案只是“文档说它应该这样做”-很好;但是它在哪里说的呢?可能是Linq2sql使用了偶数舍入吗?你用OP的值测试过了吗?谢谢,这也是我的想法所在。@AndriyM我用很多值测试过,它们都被截断了,没有四舍五入(以任何形式)。
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