SQL Сервер сохраняет десятичную шкалу и точность для операций с очень большими числами - PullRequest
0 голосов
/ 29 апреля 2020

После моего предыдущего вопроса Я все еще борюсь с арифметической c ошибкой переполнения в SQL Server 2017. Как я могу выполнить умножение / деление большого decimal(38,0) значения и сохранить / восстановить точность и масштаб?

В моем текущем примере я просто хочу вдвое сократить DECLARE @var1 decimal(38,0) = 85070591730234615865699536669866196992; (и обрезать результат, если @var1 было нечетным). Из этого поста я понял, что даже если бы я не пытался делить на 2, а умножил на 0,5, я все равно не получил бы результат decimal(38,0). Я мог бы разделить на 2 000 000, чтобы результат соответствовал результирующему типу decimal(38,6), но, учитывая правила умножения и т.д. c. , я не могу понять, как вернуться к decimal(38,0).

1 Ответ

1 голос
/ 29 апреля 2020

Этот ответ специфичен c для вашего конкретного c вопроса - деление на 2. Если вы хотите более общее решение, задайте новый вопрос.

Деление на 2 такое же, как умножение на 5 и деление на 10.

Мы не можем умножить ваше значение на 5, но мы можем сделать следующее:

  • Целочисленное деление на 10.
  • Умножить на 5.
  • Добавьте немного больше, чтобы объяснить пропажу ди git.

Но. , , вы думаете . , , как мы можем разделить на 10? Что ж, вы можете сделать это с помощью string операций: просто обрежьте последний di git:

declare @var1 decimal(38,0) = 85070591730234615865699536669866196992;

select (convert(decimal(38,0), left(convert(varchar(38), @var1), 37)) * 5 +
        convert(decimal(38, 0), (@var1 % 10) / 2)
       ) as half_a_big_value

Здесь - это db <> скрипка.

...