从数字中获取小数值的可靠方法是什么?

时间:2009-12-07 15:06:07

标签: sql sql-server sql-server-2005 tsql sql-server-2008

我有多种类型Decimal(8, 2),并且一直使用Substring来获取小数值。

E.g.)
    declare @val decimal(8, 2), @strVal varchar(10)
    set @val = 15.80
    set @strVal = cast(@val as varchar)
    select  @val, substring(@strVal, charindex('.', @strVal), len(@strVal))

是否有更好的方法可以简单地从.80获取小数值@val而无需将其转换为字符?
我想知道是否有一个内置的UDF(用户定义函数)可以解析而不必推出我自己的版本。

4 个答案:

答案 0 :(得分:8)

使用模数(%)运算符。你会得到0.80

像这样:

declare @val decimal(8, 2)
set     @val = 15.80
select  @val, @val % 1

答案 1 :(得分:2)

我认为你的意思是小数值,而不是小数值。你已经有了十进制值。要获取小数值,请使用RoundFloor函数

  Declare @Fraction Decimal(8,2)
  Set @Fraction = @Val - Floor(@Val)

  Set @Fraction = @Val - Round(@Val, 0)

答案 2 :(得分:1)

SET @val = (@val - ROUND(@val, 0, 1) * 100)

ROUND(@val,0,1)应将15.80截断为15.00。然后从15.80中减去15,然后将0.80乘以100得到数字形式的80.

ROUND函数要求将第三个参数设置为1来截断数字。否则,它会将15.80转换为16.00。请参阅:http://msdn.microsoft.com/en-us/library/ms175003.aspx

答案 3 :(得分:0)

对于那些只想返回小数值的人...(即没有小数),SQLMenace使用本文中的PARSENAME发布了一个很好的方法:How To Get Only Numbers After Decimal

使用前的重要注意事项:如果它们是无小数SELECT PARSENAME((22),2)将返回NULL ...并且SELECT PARSENAME((22),1)将仅返回整数...这可以很容易被COALESCE处理或检查零模数......但它在所有用途中可能都不实用

SELECT PARSENAME((22.777),1) -- Returns ONLY The number after decimal
SELECT PARSENAME((22.777),2) -- Returns ONLY The whole number