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] )]
参数:
- p (精度)
最多可以存储的十进制数字的总位数,包括小数点左边和右边的位数。 该精度必须是从 1 到最大精度 38 之间的值。 默认精度为 18。 - s(小数位数)
小数点右边可以存储的十进制数字的位数。 此数减去从p以确定最多的小数点左侧的位数。 小数点右边可以存储的十进制数字的最大位数。 小数位数必须介于 0 到p。 仅在指定精度后才可以指定小数位数。 默认小数位数为 0;因此,0 < = s < = p。 最大存储大小基于精度而变化。
将 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。
本文由 waynelone 创作,采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。