sql 中如何舍去小数最后一位为0 如:20.50只能取20.5

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql 中如何舍去小数最后一位为0 如:20.50只能取20.5相关的知识,希望对你有一定的参考价值。

转入的相关值,若小数点后的末尾位数存在0值,则转入时不能加0。例如20.50
转入时,值格式须转入20.5。
我用的是SQL Server

--去掉小数点后多余的0 2012-10-26
Declare @number nvarchar(20),@lastnum char(10)
--测试变量
Select @number = 25.00500
--记录最后一们数字
Select @lastnum = SUBSTRING(@number,len(@number),1)
--循环判断,只要最后一位是0,就舍去
while (@lastnum = '0')
begin
Select @number = SUBSTRING(@number,0,len(@number))
Select @lastnum = SUBSTRING(@number,len(@number),1)
end
--结果处理,如果最后一位是‘.’,就舍去
Select case when @lastnum = '.' then substring(@number,0,LEN(@number)) else @number end
Go

--注:你可以把第二行代码的数字替换下,然后所有代码一起执行,看结果是否你你想要的。追问

这个循环方法确实可以实现,我发现用cast(25.00500 as float)发现就可以实现了~
不过谢谢你了~

参考技术A 反正oralce里,
select TO_CHAR(filed)+0 from TABLE
就可以去末尾0了,并且小数点前的第一个0不被抹掉。(例:00.250-》0.25)
参考技术B -----可以先转换为字符型(字符的总长度减1),再转回数值型。
cast(substring (cast (字段 as varchar(50)),1, len(cast (字段 as varchar(50)))-1) as decimal(18,1))
参考技术C 不知道你是用的哪种数据库,Oracle中如果你设置的number类型。小数点后最后一位0是可以自动去掉的。
如果是字符串,那就要你自己写一个函数了。

浮点数在内存中的存放

float型在内存中:
第一位为符号位,8位为指数部分,23位为尾数部分
double型在内存中:
第一位为符号位,11位为指数部分,52位为尾数部分
 
用8.25说明float型在内存中的存放
 
将8.25化为二进制得到:1000.01,用科学计数法表示即1.00001*10^3
从小数部分第一位数起,数共23位放入尾数部分,不足则往右补0
即尾数部分为00001 000000 000000 000000
小数点左移了3位,取3-1=2的二进制 10 放入指数部分右端,左边补0
即指数部分现在是:10000010
我们在指数部分的第一位填 1/0 代表 正负,
(注:如果小数点左移,说明是指数是正数,如果小数点右移说明是指数是负数)
(注:n是小数点移动次数,如果n是左移得到的,取n-1,如果n是右移得到的或n=0,则将n化为二进制后在左边补0,再各位求反(除了符号位),放入指数部分右端)
(注:无符号型,符号位的第一位为 1 代表指数是正数,相当于指数部分多了一位)
 
整体在内存中表示:
01000001000001000000000000000000
如果是负数,则符号位为1就行
 
指数部分为负数情况(即右移)
用-0.25说明步骤:
 
负数符号位为1
‘‘‘
小数部分化为二进制 0.01
科学计数法右移两位即 10^-2
故指数部分第一位为0
取指数的绝对值化为二进制得 10
现在为 00000010
除符号位全部取反得 01111101
‘‘‘
尾数部分全为0
所以-0.25在内存中表示为:
10111110100000000000000000000000


以上是关于sql 中如何舍去小数最后一位为0 如:20.50只能取20.5的主要内容,如果未能解决你的问题,请参考以下文章

c中如何使输出的值小数点后最末位0舍去?

计算钱时一定要保留两位小数吗

C++中,如何保留指定的小数位,不是COUT输出~

求一时间的正则表达式: 如09:43:09-9:43:10,12:00:01-13:01:34

js取整,保留小数位数、四舍五入、科学记数法及去掉数字末尾多余的0

C语言 怎么取小数的最后一位