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:它将为非十进制值返回3select 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”的结果,上面的函数返回的结果是否正确?正如我所说的。我被迫将答案放在这里。此答案用于标记为重复的其他问题。只需调整此答案以满足您的需要。