关于 SQL Server decimal 的那点事

in Database with 0 comment

SQL Server decimal[ (p[ ,s] )]数据类型如果不写精度,则只存储整数(这一点一定要记住),存储数据的方式是将数据进行四舍五入,因此想要保存小数部分时一定要设置小数位数,以免出现问题。

具体测试sql如下:

declare @test_decimal decimal = 18.6
select @test_decimal   -- 其结果为19

declare @test_decimal decimal = 18.4
select @test_decimal    -- 其结果为18

select @@version -- Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (X64)   Jul  9 2008 14:17:44   Copyright (c) 1988-2008 Microsoft Corporation  Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) 

以下内容摘自MSDN

decimal[ (p[ ,s] )]

参数:

将 decimal 和 numeric 数据转换

有关十进制和数值数据类型, SQL Server考虑每个精度和小数位数为不同的数据类型的特定组合。 例如, decimal(5,5)和decimal(5,0)被视为不同的数据类型。

在 Transact-SQL语句,自动转换为具有小数点的常数数值数据值,使用最小的精度和缩放必要。 例如,常量 12.345 转换为数值值,该值精度为 5,小数位数为 3。

从转换十进制或数值到float或实际可能会导致某些丢失精度。 从转换int, smallint, tinyint, float,实际, money,或smallmoney为十进制或数值也会导致溢出。

默认情况下, SQL Server使用时将转换到数值进行舍入十进制或数值具有较低的精度和小数位数的值。 但如果 SET ARITHABORT 选项为 ON,则发生溢出时, SQL Server 会产生错误。 若仅降低精度和小数位数,则不会产生错误。

在将 float 值或实数值转换为 decimal 或 numeric 类型时,decimal 值不会超过 17 位小数。 任何小于 5E-18 的 float 值总是会转换为 0。

Comments are closed.