首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

关于用len()函数统计float类型函数的长度有关问题

2012-11-01 
关于用len()函数统计float类型函数的长度问题测试代码如下:declare @a intdeclare @b intdeclare @c intde

关于用len()函数统计float类型函数的长度问题
测试代码如下:
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)

运行结果如下:
(无列名)(无列名)(无列名)(无列名)
0801
(无列名)(无列名)(无列名)(无列名)
180.13
(无列名)(无列名)(无列名)(无列名)
080.014
(无列名)(无列名)(无列名)(无列名)
080.0015
(无列名)(无列名)(无列名)(无列名)
180.10016
(无列名)(无列名)(无列名)(无列名)
080.010017
(无列名)(无列名)(无列名)(无列名)
180.1010018
(无列名)(无列名)(无列名)(无列名)
180.11010016

(无列名)(无列名)(无列名)(无列名)
180.11010016

看上面的结果,为什么会出现@d的小数位数增加,但是len(@d)的长度反而减少的情况呢?加粗和红字的部分,有无人能解释一下?

[解决办法]
select @a,@b,@d,cast(@d as varchar)

select LEN(@d)



Len转长度时,会先将 @d 转成字符串再取长度的,所以你要看它转成字符串时是什么,

它转的时候,会舍掉尾数,对于 float的处理,是很怪异的,因为 float属于近似值,

可以使用 decimal,因为decimal是真实值

[解决办法]
SELECT
LEN(@d) ,
LTRIM(@d),
len(LTRIM(@d))
@d会转成字符 再计算长度

[解决办法]
declare @a float
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来计算。

除非是天文数字 。
[解决办法]
超过7位有效位,会自动四舍五入的。


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)))

热点排行