日期:2014-05-18  浏览次数:20679 次

如何去除小数位多余的0,有其他办法完美些解决吗?
在网上找了好几种方法都不是很理想
eg:

select   cast( '12.000 '     as   float)  

这样的结果是12.0


declare   @s   varchar(20)
set   @s= '12.120001 '
select   reverse(cast(cast(reverse(@s)   as   float)as   varchar))


declare   @s   varchar(20)
set   @s= '12.120001 '
select   reverse(cast(reverse(@s)   as   float))

这样的结果有错是  
120001

有其他办法完美些解决吗?

------解决方案--------------------
declare @s varchar(20)
set @s= '12.120001 '
select substring(convert(varchar,@s)+ '00 ',1,charindex( '. ',convert(varchar,@s)+ '00 ')+2)

--结果
--------------------------------
12.12


------解决方案--------------------
declare @s varchar(20)
set @s= '1200.000 '
select left(@s,len(@s)-PATINDEX( '%[^0]% ',reverse(@s))+1)--如果不允许整数后有小数点用下面的
select case when @s=FLOOR(@s) then left(@s,charindex( '. ',@s)-1) else left(@s,len(@s)-PATINDEX( '%[^0]% ',reverse(@s))+1) end

------解决方案--------------------
没明白楼主要实现什么功能?
给出例子,给出结果。
还有ceiling等函数可以尝试一下。
------解决方案--------------------
CREATE function dbo.f_mydecimal(@str varchar(1000))
returns varchar(50)
as
begin
declare @ret varchar(100)
--@num_afterDot
--@num_beforeDot
declare @num_afterDot int,@num_beforeDot varchar(100)
set @num_afterDot=reverse(convert(int,substring(reverse(@str),0,charindex( '. ',reverse(@str)))))
set @num_beforeDot=substring(@str,0,charindex( '. ',@str))
set @ret=@num_beforeDot+
case @num_afterDot when 0 then ' '
else '. '+convert(varchar,@num_afterDot)
end
return @ret
end
GO
------解决方案--------------------
看楼主举的例子,都是把字符转换成float,再处理显示问题

如果转换成 float 是必须的,或者是楼主存储的数据本来就是 float 类型

则这个问题基本上无解, 因为 float 存储的本来就是非精度数据, 不能保证 100% 还原(有时候有很微小的误差),既然数据都不能 100% 还原到存储之前, 所以也无法得到楼主想要的结果