测试代码如下:
declare @a int
declare @b int
declare @c int
declare @d float
set @b=CONVERT(int,15*RAND()+2)
set @c=0
set @a=CONVERT(int,2*RAND())
set @d=convert(float,@a)/10
while @c<@b
begin
set @d=(@d+convert(float,@a))/10
select @a,@b,@d
select LEN(@d)
set @a=CONVERT(int,2*RAND())
set @c=@c+1
end
select @a,@b,@d
select LEN(@d)运行结果如下:
(无列名) (无列名) (无列名) (无列名)
0 8 0 1
(无列名) (无列名) (无列名) (无列名)
1 8 0.1 3
(无列名) (无列名) (无列名) (无列名)
0 8 0.01 4
(无列名) (无列名) (无列名) (无列名)
0 8 0.001 5
(无列名) (无列名) (无列名) (无列名)
1 8 0.1001 6
(无列名) (无列名) (无列名) (无列名)
0 8 0.01001 7
(无列名) (无列名) (无列名) (无列名)
1 8 0.101001 8
(无列名) (无列名) (无列名) (无列名)
1 8 0.1101001 6(无列名) (无列名) (无列名) (无列名)
1 8 0.1101001 6看上面的结果,为什么会出现@d的小数位数增加,但是len(@d)的长度反而减少的情况呢?加粗和红字的部分,有无人能解释一下?
declare @a int
declare @b int
declare @c int
declare @d float
set @b=CONVERT(int,15*RAND()+2)
set @c=0
set @a=CONVERT(int,2*RAND())
set @d=convert(float,@a)/10
while @c<@b
begin
set @d=(@d+convert(float,@a))/10
select @a,@b,@d
select LEN(@d)
set @a=CONVERT(int,2*RAND())
set @c=@c+1
end
select @a,@b,@d
select LEN(@d)运行结果如下:
(无列名) (无列名) (无列名) (无列名)
0 8 0 1
(无列名) (无列名) (无列名) (无列名)
1 8 0.1 3
(无列名) (无列名) (无列名) (无列名)
0 8 0.01 4
(无列名) (无列名) (无列名) (无列名)
0 8 0.001 5
(无列名) (无列名) (无列名) (无列名)
1 8 0.1001 6
(无列名) (无列名) (无列名) (无列名)
0 8 0.01001 7
(无列名) (无列名) (无列名) (无列名)
1 8 0.101001 8
(无列名) (无列名) (无列名) (无列名)
1 8 0.1101001 6(无列名) (无列名) (无列名) (无列名)
1 8 0.1101001 6看上面的结果,为什么会出现@d的小数位数增加,但是len(@d)的长度反而减少的情况呢?加粗和红字的部分,有无人能解释一下?
LEN ( string_expression )
这个要用string类型的。
LEN(@d) ,
LTRIM(@d),
len(LTRIM(@d))
@d会转成字符 再计算长度
看你那么纠结的,float本来就不定长度的,而且是近似值,
什么叫近似值,你先了解一下浮点数是如何表示的,谷歌一下“IEEE浮点数格式”decimal是真实值,
set @a = 0.1101001
select @a,len(@a),ltrim(@a),ltrim(cast(@a as decimal(20,10)))float有效位数很小,只有7位,而你红色的那行,已经超过7位了,所以建议你用decimal, decimal有效位数很长,而且是真实值。至于你说decimal后面补0的情况,你格式化一下数字就行了,有很多格式话字符的方法。不能因为显示的原因,而让计算不正确。编程的一条铁的规定,就是先要保证数据正确,然后才去考虑其它问题。而你为了贪图那点显示格式,而让数据计算不正确。只要是计算,都采用decimal来计算。除非是天文数字 。
declare @a float
set @a = 0.1101004
select @a,len(@a),ltrim(@a),ltrim(cast(@a as decimal(20,10)))set @a = 0.1101005
select @a,len(@a),ltrim(@a),ltrim(cast(@a as decimal(20,10)))
如果一定要用,一定要知道它是近似值,并非真实值。