Каким был бы надежный способ получить дробное значение от числа?

У меня есть число типа 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 (определяемая пользователем функция ), который будет анализировать вместо развертывания моей собственной версии.


person dance2die    schedule 07.12.2009    source источник
comment
Ваш вопрос не имеет смысла. у вас есть десятичная дробь и вы пытаетесь преобразовать ее в десятичную????   -  person JonH    schedule 07.12.2009
comment
Какой ??! У вас уже есть десятичное значение в @val. Подстрока извлекает дробное значение как символьное значение.   -  person Charles Bretana    schedule 07.12.2009
comment
Да, я пытаюсь получить дробное значение типа int. Итак, с 15.80 я хотел бы получить .80   -  person dance2die    schedule 07.12.2009


Ответы (4)


Используйте оператор модуля (%). Вы получите 0.80.

Так:

declare @val decimal(8, 2)
set     @val = 15.80
select  @val, @val % 1
person Nathan Wheeler    schedule 07.12.2009
comment
Ха, меньшего и не ожидал от парня с ручкой, md5sum. Спасибо. - person dance2die; 07.12.2009
comment
Не уверен, почему люди постоянно упускают из виду оператор модуля ... Я видел несколько ДЕЙСТВИТЕЛЬНО причудливых способов отделения целых чисел от десятичных значений. - person Nathan Wheeler; 07.12.2009

Я думаю, вы имеете в виду дробное значение, а не десятичное значение. У вас уже есть десятичное значение. Чтобы получить дробное значение, используйте Round, или функции Floor

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

or

  Set @Fraction = @Val - Round(@Val, 0)
person Charles Bretana    schedule 07.12.2009
comment
Я еще не изучал математические функции, и это выглядит как простой, но надежный способ получить дробное число. Спасибо, Чарльз. - person dance2die; 07.12.2009
comment
Нет проблем, ознакомьтесь с справочными ссылками на Раунд и этаж, чтобы увидеть, как они работают, и в чем различия между ними... - person Charles Bretana; 07.12.2009

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

ROUND(@val, 0, 1) должен обрезать 15,80 до 15,00. Затем вы вычитаете 15 из 15,80 и умножаете 0,80 на 100, чтобы получить 80 в числовой форме.

Функция ОКРУГЛ требует, чтобы третий параметр был установлен в 1, чтобы усечь число. В противном случае он преобразовал бы 15,80 в 16,00. См.: http://msdn.microsoft.com/en-us/library/ms175003.aspx.

person Daniel Vassallo    schedule 07.12.2009

Для тех, кто хочет вернуть только дробное значение... (т.е. без десятичного числа), SQLMenace опубликовал отличный способ сделать это с помощью PARSENAME из этой статьи: Как получить только числа после запятой

ВАЖНОЕ ПРИМЕЧАНИЕ перед использованием: если они не являются десятичными, 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
person Anthony Griggs    schedule 14.03.2014