Sql 获取浮点小数点后的位数(带或不带小数部分)

Sql 获取浮点小数点后的位数(带或不带小数部分),sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我的表格中有以下金额(浮动) Amount 123 123.1 123.0123 123.789456 如何获取小数点后的位数 重复?:我已经检查了已有的帖子,但是没有正确的方法来处理带有或不带小数部分的浮点数 结果 Amount Result 123 0 123.1 1 123.0123 4 123.789456 6 编辑: 在花了一些宝贵的时间之后,我找到了一些相对简单的脚本来处理这个问题。我的答案是您可以通过以下方式完成: 查询 SELEC

我的表格中有以下
金额(浮动)

Amount
123
123.1
123.0123
123.789456
如何获取小数点后的位数

重复?:我已经检查了已有的帖子,但是没有正确的方法来处理带有或不带小数部分的
浮点数

结果

Amount      Result
123         0
123.1       1
123.0123    4
123.789456  6
编辑
在花了一些宝贵的时间之后,我找到了一些相对简单的脚本来处理这个问题。我的答案是

您可以通过以下方式完成:

查询

SELECT Amount, 
       CASE WHEN FLOOR(Amount) <> CEILING(Amount) THEN LEN(CONVERT(INT,CONVERT(FLOAT,REVERSE(CONVERT(VARCHAR(50), Amount, 128))))) ELSE 0 END AS Result
FROM YourTable

您可以通过以下方式执行此操作:

查询

SELECT Amount, 
       CASE WHEN FLOOR(Amount) <> CEILING(Amount) THEN LEN(CONVERT(INT,CONVERT(FLOAT,REVERSE(CONVERT(VARCHAR(50), Amount, 128))))) ELSE 0 END AS Result
FROM YourTable

谢谢你指出我的错误。 我没有意识到浮子的特殊行为

declare @t table(Amount float)
insert into @t values (123),(123.1),(123.0123),(123.789456)
看,这一行就行了

select CONVERT (VARCHAR(50), amount,128) from @t
完整的脚本

select col ,case when len(col)>0 then len(col) else 0 end newcol from
(SELECT substring(REVERSE(CONVERT (VARCHAR(50), amount,128)),0,
charindex('.',REVERSE(CONVERT (VARCHAR(50), amount,128)))) col from @t)t4

谢谢你指出我的错误。 我没有意识到浮子的特殊行为

declare @t table(Amount float)
insert into @t values (123),(123.1),(123.0123),(123.789456)
看,这一行就行了

select CONVERT (VARCHAR(50), amount,128) from @t
完整的脚本

select col ,case when len(col)>0 then len(col) else 0 end newcol from
(SELECT substring(REVERSE(CONVERT (VARCHAR(50), amount,128)),0,
charindex('.',REVERSE(CONVERT (VARCHAR(50), amount,128)))) col from @t)t4

这段代码肯定会对你有所帮助

SELECT Amount,
       LEN(SUBSTRING(CAST(Amount as VARCHAR),CHARINDEX('.',CAST(Amount as VARCHAR))+1,LEN(Amount)))  Result
FROM [Your Table Name]

这段代码肯定会对你有所帮助

SELECT Amount,
       LEN(SUBSTRING(CAST(Amount as VARCHAR),CHARINDEX('.',CAST(Amount as VARCHAR))+1,LEN(Amount)))  Result
FROM [Your Table Name]

我找到了一些简单的脚本(相对于我而言)来处理这个问题

ISNULL(NULLIF(CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))),0) - 1,0)
这里的
ISNULL(NULLIF
仅用于处理不带小数部分的浮点。 如果没有不带小数部分的值,那么它非常简单

CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))) -1 
希望这对你有帮助。 全文如下

declare @YourTable table (Amount float)
insert into @YourTable
values(123),(123.1),(123.0123),(123.789456)

SELECT  ISNULL(NULLIF(CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))),0) - 1,0)
FROM    @YourTable

SELECT  CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))) -1 
FROM    @YourTable

我找到了一些简单的脚本(相对于我而言)来处理这个问题

ISNULL(NULLIF(CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))),0) - 1,0)
这里的
ISNULL(NULLIF
仅用于处理不带小数部分的浮点。 如果没有不带小数部分的值,那么它非常简单

CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))) -1 
希望这对你有帮助。 全文如下

declare @YourTable table (Amount float)
insert into @YourTable
values(123),(123.1),(123.0123),(123.789456)

SELECT  ISNULL(NULLIF(CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))),0) - 1,0)
FROM    @YourTable

SELECT  CHARINDEX('.',REVERSE(CONVERT(VARCHAR(50), Amount, 128))) -1 
FROM    @YourTable
还有一个方法:

SELECT  Amount,
        CASE WHEN deci = 0 THEN 0 ELSE LEN(deci) END AS Result
FROM (
    SELECT  Amount,
            TRY_CAST(REVERSE(REPLACE(Amount - TRY_CAST(Amount as int),'0.','')) as int) as deci
    FROM (VALUES
    (123),
    (123.1),
    (123.0123),
    (123.789456)
    ) as t (Amount)
) as t
输出:

Amount      Result
123.000000  0
123.100000  1
123.012300  4
123.789456  6
还有一个方法:

SELECT  Amount,
        CASE WHEN deci = 0 THEN 0 ELSE LEN(deci) END AS Result
FROM (
    SELECT  Amount,
            TRY_CAST(REVERSE(REPLACE(Amount - TRY_CAST(Amount as int),'0.','')) as int) as deci
    FROM (VALUES
    (123),
    (123.1),
    (123.0123),
    (123.789456)
    ) as t (Amount)
) as t
输出:

Amount      Result
123.000000  0
123.100000  1
123.012300  4
123.789456  6

由于这是一个重复的问题,我没有选择把我的答案放在这里

/* Assumes money data type is passed in and therefore caters for overflow */
CREATE FUNCTION dbo.CountDecimalPlaces (@value decimal(30,4))  
RETURNS int
AS  
BEGIN 
    DECLARE @part decimal(30,4);
    SET @part = ABS(@value - CAST(@value as bigint));
    RETURN LEN(FORMAT(@part, '0.00##'))-2
END

由于这是一个重复的问题,我没有选择把我的答案放在这里

/* Assumes money data type is passed in and therefore caters for overflow */
CREATE FUNCTION dbo.CountDecimalPlaces (@value decimal(30,4))  
RETURNS int
AS  
BEGIN 
    DECLARE @part decimal(30,4);
    SET @part = ABS(@value - CAST(@value as bigint));
    RETURN LEN(FORMAT(@part, '0.00##'))-2
END


select len(子字符串('123.789456',charindex('.','123.789456')+1,len('123.789456'))@artm的可能重复,如果浮点,则数据类型为。声明@v float set@v=0.0012选择SQL_VARIANT_属性(@v,'Scale')作为比例,结果为=0???@KumarHarsh:对于非十进制值
select len(子字符串('123',charindex('.','123'),'123')+1,len它将返回3('123'))
浮点是近似数字。为什么要计算小数?select len(子字符串('123.789456',charindex('.','123.789456')+1,len('123.789456'))@artm,数据类型如果是浮点。声明@v float set@v=0.0012选择SQL\u VARIANT\u属性(@v,'Scale'))作为刻度,结果是=0°@KumarHarsh:它将为非十进制值返回3
select len(子字符串('123',charindex('123','123')+1,len('123'))
浮点是近似数字。为什么计数小数?如果浮点没有任何小数,它将失败。
声明@float float=123;选择len(转换(INT,转换(float,REVERSE))(CONVERT(VARCHAR(50),@float,128‘‘‘‘‘‘)作为结果;
@Arulkumar感谢您的通知,修复了它,更新了答案。当然,到目前为止,这对我来说是好的(但我在等待,如果有任何简单的查询没有这么多转换和强制转换-可能是:))对于一个通用解决方案,请尝试ABS()获取金额,因为它在负值上失败:)如果浮点没有任何小数,它将失败。
DECLARE@float float=123;结果选择LEN(CONVERT(INT,CONVERT(float,REVERSE)(CONVERT(VARCHAR(50),@float,128‘‘‘)’));
@Arulkumar感谢您的通知,修复了它,更新了答案。当然,到目前为止这对我很好(但我在等待没有这么多转换和强制转换的简单查询-可能是:))对于一般解决方案,请尝试ABS()获取金额,因为它在负值上失败:)感谢您的重播,很好,但我认为我的一个相对简单(到目前为止),然后是@Stanislovas Kalašnikovas回答。我很高兴!我在发布我的回答后看到了你的回复,看起来确实简单多了。谢谢你的重播,很好,但我认为我的回复相对简单(到目前为止),然后是@Stanislovas Kalašnikovas答案。我很高兴!我在发布我的答案后看到了你的回复,它看起来确实简单多了。请检查“1234.1”的结果,上面的函数返回正确结果吗?正如我所说的。我被迫将我的答案放在这里。答案是针对另一个标记为重复的问题。简单调整此答案以满足您的需要。请检查“1234.1”的结果,上面的函数返回的结果是否正确?正如我所说的。我被迫将答案放在这里。此答案用于标记为重复的其他问题。只需调整此答案以满足您的需要。