如何获取ms sql中float列中小数点后的位数?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取ms sql中float列中小数点后的位数?相关的知识,希望对你有一定的参考价值。

我必须计算MS Sql Server(2005或2008无关紧要)托管的数据库中小数点后的数字,以便纠正用户所犯的一些错误。我在Oracle数据库上遇到了同样的问题,但事情并不复杂。底线是Oracle上的选择是:

select length( substr(to_char(MY_FIELD), instr(to_char(MY_FILED),'.',1,1)+1, length(to_char(MY_FILED)))) as digits_length
from MY_TABLE

提交的My_filed是浮点数(38)。

在Ms Sql服务器上我尝试使用:

select LEN(SUBSTRING(CAST(MY_FIELD AS VARCHAR), CHARINDEX('.',CAST(MY_FILED AS VARCHAR),1)+1, LEN(CAST(MY_FIELD AS VARCHAR)))) as digits_length
from MY_TABLE

问题是在MS Sql Server上,当我将MY_FIELD转换为varchar时,浮点数仅被截断2位小数并且数字的计数错误。有人可以给我任何提示吗?

最好的祝福。

答案
SELECT 
LEN(CAST(REVERSE(SUBSTRING(STR(MY_FIELD, 13, 11), CHARINDEX('.', STR(MY_FIELD, 13, 11)) + 1, 20)) AS decimal)) 
from TABLE
另一答案

我从朋友那里得到了一个非常简单的解决方案。所以我会发布解决方法,以帮助其他人和我一样。

一,制作功能:

create FUNCTION dbo.countDigits(@A float) RETURNS tinyint AS
BEGIN
declare @R tinyint
IF @A IS NULL 
   RETURN NULL
set @R = 0
while @A - str(@A, 18 + @R, @r) <> 0
begin
   SET @R = @R + 1
end
RETURN @R
END
GO

第二:

select MY_FIELD,
dbo.countDigits(MY_FIELD) 
from MY_TABLE

使用该函数将获得小数点后的确切位数。

另一答案

首先是切换到使用CONVERT而不是CAST。不同的是,使用CONVERT,您可以指定格式代码。 CAST使用默认格式代码:

当expression是float或real时,style可以是下表中显示的值之一。其他值处理为0。

没有一种格式特别吸引人,但我认为你最好使用的是2。所以它会是:

CONVERT(varchar(25),MY_FIELD,2)

不幸的是,这将为您提供科学记数法的价值,并始终使用16位数字,例如1.234567890123456e+000。要获得“真实”数字的数量,您需要将此数字拆分,计算小数部分中的位数,并将其与指数中提供的数字相抵消。


当然,在处理具有已定义二进制表示的数字时,插入关于尝试讨论数字的常见警告/警告。特定float的“数字”数量可能会有所不同,具体取决于计算方式。

另一答案

我不确定速度。等或此代码的优雅。这是为了一些临时测试找到第一个十进制值。但是这段代码可以改为循环遍历所有小数,并且可以轻松找到最后一次大于零的值。

DECLARE @NoOfDecimals       int             = 0 
Declare @ROUNDINGPRECISION  numeric(32,16)  = -.00001000

select @ROUNDINGPRECISION = ABS(@ROUNDINGPRECISION)
select @ROUNDINGPRECISION = @ROUNDINGPRECISION - floor(@ROUNDINGPRECISION)


while @ROUNDINGPRECISION < 1
Begin
    select @NoOfDecimals = @NoOfDecimals +1
    select @ROUNDINGPRECISION =  @ROUNDINGPRECISION * 10

end;

select @NoOfDecimals

以上是关于如何获取ms sql中float列中小数点后的位数?的主要内容,如果未能解决你的问题,请参考以下文章

access数据库中小数点前0没有了

SQL中float转varchar并去掉小数点后的值

c语言如何控制小数位数

SQL中的小数点后的输入位数.

如何让SQL不显示小数点后的0

matlab矩阵--如何控制矩阵中小数点的位数