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自动舍入值时,它的设置它们,但不是在插入它们的时候。这是正确的吗?
不。
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
是正确的