Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: dance2dieОтветов: 4

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

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

sqlsql-servertsqlsql-server-2008sql-server-2005

Ответы

Ответ 1 · рейтинг 9 · Nathan Wheeler

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

Так:

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

Ответ 2 · рейтинг 2 · Charles Bretana

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

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

or

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

Ответ 3 · рейтинг 1 · Daniel Vassallo

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.

Ответ 4 · Anthony Griggs

Для тех, кто хочет вернуть только дробное значение... (т.е. без десятичного числа), 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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы