SQL Server插入时的舍入问题

本文关键字:舍入 问题 Server 插入 SQL | 更新日期: 2023-09-27 18:18:36

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

数据库中的列数据类型为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只截断插入时,但四舍五入时设置?

SQL Server插入时的舍入问题

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

不。

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

返回-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错误。你应该把数字四舍五入后再寄出去。

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