代码之家  ›  专栏  ›  技术社区  ›  dance2die

从数字中得到分数值的可靠方法是什么?

  •  0
  • dance2die  · 技术社区  · 15 年前

    我有很多种类型 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 回复  |  直到 11 年前
        1
  •  8
  •   Nathan Wheeler    15 年前

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

    这样地:

    declare @val decimal(8, 2)
    set     @val = 15.80
    select  @val, @val % 1
    
        2
  •  2
  •   Charles Bretana    15 年前

    我认为你的意思是分数,而不是十进位。您已经有了十进制值。要获取分数值,请使用 Round Floor 功能

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

      Set @Fraction = @Val - Round(@Val, 0)
    
        3
  •  1
  •   Daniel Vassallo    15 年前
    SET @val = (@val - ROUND(@val, 0, 1) * 100)
    

    圆(@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 .

        4
  •  0
  •   Community CDub    7 年前

    对于那些只想返回分数值的人…(即,没有小数点)sqlmenace使用本文中的parsename发布了一个很好的方法来实现这一点: How To Get Only Numbers After Decimal

    使用前请注意:如果它们不是十进制,则select parsename((22),2)将返回空值…选择parseName((22),1)将只返回整数…这可以很容易地通过合并或检查零模量…但它可能不适用于所有用途

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