- 作者:admin
- 发表时间:2020-11-27 07:50
- 来源:未知
这篇文章主要介绍了sqlserver中的小数类型的相关知识,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
在SQL Server中实际上只有两种小数数值类型,分别是float(近似数值)和decimal(精确数值),这两种类型能表示所有的小数数值类型。
float(近似数值类型)
float表示的是近似数值,存在一定的精度缺失。
float(n)
这里的n是以科学计数法存储浮点数尾数的位数,因此此参数决定了精度和存储的大小。其是可选的,默认值是53,即float等价于float(53),占用8bytes。如果指定了n,则它必须是介于1至53之间的值。实际上,虽然n的取值范围定义是1唐山网络公司至53,但实际上float只能表示float(53)和float(24)两种类型,分别占用8bytes和4bytes。
使用近似数值要格外注意尽量避免相等比较,因为比如1可以被存储为1.000000056,也可以被存储为1.00000000672,进行相等比较会得到意料之外的结果。
decimal(精确数值类型)
decimal表示的是精确数值类型。不存在精度损失,别名是numeric。
decimal(p, s)
-- 等价于
numeric(p, s)
精确数值类型需要分别指定小数的最大位数(p)和小数位的数量(s):
p(precision):指定小数的最大位数,小数点的左侧和右侧的数字的总数量不能超过p,p的取值范围是从1到38,默认值为18。
s(scale):指定在小数点右侧的小数位数,p-s是小数点左边的最大位数。s必须是从0到p的值,只有在指定了精度的情况下才能指定s,s的默认值是0,因此,0 <= s <= p。
p的大小也同时决定了存储位数的大小:
因为p和s必须遵守规则:0 <= s <= p <= 38,所以decimal(p, s)实际上能够表示的有效值是从-10^38+1到10^38-1。这就意味着,decimal数据类型的最大精度是38,即最多可以存储38位数字,所有这些数字均可位于小数点后面。decimal数据类型存储精确的数字表示形式,没有近似值。
小数的除法
小数的除法实际上是近似运算,因此在使用除法的时候SQL Server会自动将小数的类型提升为float类型(隐式数据类型升级)。
小数常量的默认数据类型是decimal,但是float类型的优先级比decimal类型要高。在默认的情况下,SQL Server会将小数数值的常量自动转换为decimal数据类型(常态下),而在进行小数的除法运算的时候,则会就近进行数据类型的升级,转换为float(24)或float(53)数据类型(运算时)。