SQLServer的⼩数数值类型(float和decimal)⽤法
在SQL Server中,⼩数数值实际上只有两种数据类型:float 和 decimal。double precision 整体是数据类型,等价于 float(53),real等价于float(24),应该避免在程序中直接使⽤ double precision 和 real,⽽是⽤ float 代替。numeric 和 decimal是同义词。
float是近似数值,存在精度缺失,Decimal是精确数值,不存在精度损失。当数值不允许精度丢失时,使⽤ decimal数据类型存储。在计算⼩数的除法时,SQL Server 内部隐式升级数据类型,根据⼩数数值的数据类型,就近向float(24) 或float(53)转换。
⼀:近似数值,存在精度损失
1,float 表⽰近似数值
float数据类型的默认类型是float(53),占⽤8bytes,实际上,float 只能表⽰两种类型float(53) 和 float(24),分别占⽤ 4Bytes 和 8Bytes。float [ (n) ]
Where n is the number of bits that are used to store the mantissa of the float number in scientific notation and, therefore, dictates the precision and storage size. If n is specified, it must be a value between 1 and 53. The default value of n is 53.
n value Precision Storage size
1-24 7 digits 4 bytes
25-53 15 digits8 bytes
decimal是整数数据类型Note:SQL Server treats n as one of two possible values. If 1<=n<=24, n is treated as 24. If 25<=n<=53, n is treated as 53.
2,在SQL Server中,⼩数常量的默认数据类型是decimal,decimal的优先级⽐float⾼。
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.
⽰例1,由于在TSQL中,⼩数数值会⾃动转换为numeric类型,1.0⾃动转换为numeric(2, 1),但是在计算除法时,SQL Server 将1.0隐式转换为float(24)。
declare @f_low float(24)declare @f_high float(53)select @f_low=cast(1.0 as float(24))/3,@f_high=cast(1.0 as float(53))/3select 1.0/3 as f,@f_low as f_lo w, @f_high as f_high
在 WHERE ⼦句中设置搜索条件(特别是 = 和 <> 运算符),应避免使⽤ float 列,float 列最好只限于 > ⽐较或 < ⽐较。
⼆,精确数值,不存在精度损失
1,decimal 数据类型需要分别指定⼩数数值的最⼤位数(p)和⼩数位的数量(s),decimal 和 numeric 是等价的。
Numeric data types that have fixed precision and scale.
decimal [ (p[ ,s] )]
Fixed precision and scale numbers. When maximum precision is used, valid values are from - 10^38 +1 through 10^38 - 1.
p (precision)
The maximum total number of decimal digits that will be stored, both to the left and to the right of the decimal point. The precision must be a value from 1 through the maximum precision of 38. The default precision is 18.
s (scale)
The number of decimal digits that will be stored to the right of the decimal point. This number is substracted from p to determine the maximum number of digits to the left of the decimal point. Scale must be a value from 0 through p. Scale can be specified only if precision is specified. The default scale is 0; therefore, 0 <= s <= p. Maximum storage sizes vary, based on the precision.
Precision Storage bytes
1 - 95
10-199
20-2813
29-3817
Note:p 和 s 必须遵守规则:0 <= s <= p <= 38
numeric 和 decimal 数据类型的默认最⼤精度为 38。在 Transact-SQL 中,numeric 的功能等同于 decimal 数据类型。
decimal 数据类型最多可以存储 38 个数字,所有这些数字均可位于⼩数点后⾯。decimal 数据类型存储精确的数字表⽰形式,存储值没有近似值。
定义 decimal 列、变量和参数的两种属性为:
p 指定精度或对象能够⽀持的数字个数。
s 指定可以放在⼩数点右边的⼩数位数或数字个数。
p 和 s 必须遵守规则:0 <= s <= p <= 38。
numeric 和 decimal 数据类型的默认最⼤精度为 38。在 Transact-SQL 中,numeric 的功能等同于 decimal 数据类型。
2,⽰例
declare @dec decimal(38,37)declare @num decimal(38,37)select @dec=cast(1.0 as decimal(38,37))/3,@num=cast(1.0 as NUMERIC(38,37))select @d ec,@num,1.0/3,cast(1.0 as float(24))/3,1.000000000000/3,cast(1.0 as float(53))/3
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)set @d=123.45SELECT 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)set @dt=50.8863983154297set @df=50.8863983154297select @df as df,@dt as dt, str(@dt,38,30) a s 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,返回的是近似值。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论