我有一个计算值为-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是否仅在插入时截断,但在设置时为圆形?
答案 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进行了测试,具体情况如下:
执行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
是正确的。