SQLServer小数类型(float和decimal)(转载)

更新时间:2023-07-26 19:00:41 阅读: 评论:0

SQLServer⼩数类型(float和decimal)(转载)
在SQL Server中,实际上⼩数数值只有两种数据类型:float和decimal,分别是近似数值和精确数值。其他⼩数类型,都可以使⽤float和decimal来替代,例如,双精度(double precision)数据类型等价于 float(53),real等价于float(24),numeric是 decimal的同义词,应该避免在程序中直接使⽤ double precision、real和numeric,⽽是⽤ float(24) 、float(53)和decimal 代替。
float是近似数值,存在精度缺失;decimal是精确数值,不存在精度损失。当数值不允许精度丢失时,使⽤ decimal数据类型存储数据。在计算⼩数的除法
时,SQL Server 内部隐式升级数据类型,根据⼩数数值的数据类型,就近向float(24) 或float(53)转换。
⼀,近似数值
float 表⽰近似数值,存在精度损失,数据类型是 float(n),n是可选的,默认类型是float(53),占⽤8bytes。虽然n的取值范围是1-53,实际上,float 只能表⽰两种类型float(53) 和 float(24),分别占⽤ 8Bytes 和 4Bytes。
其中n是以科学计数法存储浮点数尾数的位数,因此决定了精度和存储⼤⼩。如果指定了n,则它必须是介于1和53之间的值,n的缺省值是53。
n Precision Storage size
1-24    7 digits    4 bytes
25-53  15 digits8 bytes
注意:SQL Server将n视为两个可能值之⼀。如果1 <= n <= 24,则将n视为24;如果25 <= n <= 53,则将n视为53。
近似数值很难确定是否相等,因此,应避免对 float 类型做相等⽐较,⽽只限于⽐较 > 或 < 。
⼆,精确数值
decimal不存在精度损失,数据类型decimal(p,s) 需要分别指定⼩数的最⼤位数(p)和⼩数位的数量(s):
p (precision) :指定⼩数的最⼤位数,⼩数点的左侧和右侧的数字的总数量不能超过p,p的取值范围是从1到38,默认值为18。
s (scale):指定在⼩数点右侧的⼩数位数,p-s是⼩数点左边的最⼤位数。s必须是从0到p的值,只有在指定了精度的情况下才能指定s,s的默认值是0,因此,0 <= s <= p。
Precision Storage bytes
1 - 95
10-199
20-2813
29-3817
柳宗元简介p 和 s 必须遵守规则:0 <= s <= p <= 38,decimal(p,s) 能够表⽰的有效值是从 - 10^38 +1  到 10^38 - 1。
decimal 数据类型的最⼤精度为 38,这意味着,decimal 数据类型最多可以存储 38位数字,所有这些数字均可位于⼩数点后⾯。decimal 数据类型存储精确的数字表⽰形式,没有近似值。
三,⼩数的除法是近似计算
⼩数的除法是近似计算,必须把⼩数的类型提升为float类型。⼩数常量的默认数据类型是decimal,float的优先级⽐decimal⾼。
在Transact-SQL语句中,具有⼩数点的常量会⾃动转换为decimal,并使⽤必需的最⼩精度和⼩数位数。例如,将常量12.345转换为⼩数类
型,decimal(5,3),即精度为5,⼩数位为3。
在TSQL中,⼩数常量是decimal类型,如以下⽰例,TSQL把常量 1.0 ⾃动转换为decimal(2,1),在计算除法时,TSQL⾃动把decimal转换位float类型。
declare@f_low float(24)
declare@f_high float(53)
lect@f_low=cast(1.0as float(24))/3,@f_high=cast(1.0as float(53))/3
lect1.0/3as f,@f_low as f_low, @f_high as f_high
declare@dec decimal(38,37)
declare@num decimal(38,37)
lect@dec=cast(1.0as decimal(38,37))/3,@num=cast(1.0as decimal(38,37))
lect@dec,@num,1.0/3,cast(1.0as float(24))/3,1.000000000000/3,cast(1.0as float(53))/3
默认情况下,SQL Server将⼩数常量作为decimal 数据类型,在计算⼩数的除法时,就近进⾏数据类型的升级,转换为float(24)或float(53) 数据类型。
在 Transact-SQL 语句中,⼩数数值的常量⾃动转换为 decimal 数据类型,在转换时,使⽤最⼩的精度和⼩数位数。例如,常量 12.345 被转换为 numeric 值,其精度为 5,⼩数位为 3。
In Transact-SQL statements, a constant with a decimal point is automatically converted into a numeric data value, using the minimum precision and scale necessary. For example, the constant 12.345 is converted into a numeric value with a precision of 5 and a scale of 3.
坐月子可以吹空调吗
湘玉竹四,将⼩数转换成字符串(varchar)
相⽐cast(float_expression as float(24/53)),使⽤ str 函数能够有效控制近似数值的⼩数位数,函数str获取的是近似数值。
STR ( float_expression [ , length [ , decimal ] ] )
范进中举续写
length是⼩数的总位数,包含正负符号,⼩数点,⼩数点左边和右边数字个数之和;
decimal是⼩数位的数量(⼩数点右边数字个数),⼩数位最⼤为16位,不能超过16,否则,会被截断为16位。如果⼩数位没有decimal多,那么右边补0。
返回值是varchar类型。
1,对⼩数常量转换为varchar类型,减少⼩数位的数量,由2位减少为1位。
窦太主SELECT STR(123.45, 6, 1);
2,将decimal 变量转换为varchar类型
declare@d decimal(10,2)
阴影的英文t@d=123.45
SELECT STR(@d, 6, 1);
炮兵
3,将 float 表达式的值转换为varchar 类型
1.0/3 默认转换为float(24) 类型,因此只有6位⼩数,⼩于decimal 参数的8位,右边补两个0。
SELECT STR(1.0/3, 10, 8);
4,在将float和decimal转换为varchar类型时,使⽤函数str或cast强制转换,返回的数值可能是不相同
declare@dt decimal(38,30)
declare@df float(53)
t@dt=50.8863983154297
t@df=50.8863983154297
后囟门lect@df as df,@dt as dt,
str(@dt,38,30) as str_dt,str(@df,38,30) as str_df,
cast(@dt as varchar(100)) as var_dt,cast(@df as varchar(100)) as var_df
字段str_dt和str_df的值是不相同的,str函数⾸先对这两个⼩数数值取近似值,使⽤cast强制转换,对于decimal,返回的是精确值,对于float,返回的是近似值。
参考⽂献:

本文发布于:2023-07-26 19:00:41,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1118652.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数值   精度   类型   数据类型   转换   位数   常量   数点
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图