Точность подразделения десятичного числа T-SQL

24
задан Chandu 4 July 2011 в 16:54
поделиться

4 ответа

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

, Но подразделение просто уничтожает Вашу голову. Я прочь, чтобы лечь теперь.

В SQL называет, хотя, это точно как ожидалось.

--Precision = p1 - s1 + s2 + max(6, s1 + p2 + 1)
--Scale = max(6, s1 + p2 + 1)

--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 9 + 54 = 72
--Max P = 38, P & S are linked, so (72,54) -> (38,20)
--So, we have 38,20 output (but we don use 20 d.p. for this sum) = 11.74438969709659
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,9),12499999.9999)


--Scale = 15 + 38 + 1 = 54
--Precision = 30 - 15 + 15 + 54 = 84
--Max P = 38, P & S are linked, so (84,54) -> (38,8)
--So, we have 38,8 output = 11.74438969
SELECT CONVERT(DECIMAL(30,15),146804871.212533)/CONVERT(DECIMAL (38,15),12499999.9999)

можно сделать ту же математику, если следуют это правило также, если Вы рассматриваете каждую пару числа как

  • 146804871.212533000000000 и 12499999.999900000
  • 146804871.212533000000000 и 12499999.999900000000000
30
ответ дан Andriy M 28 November 2019 в 22:41
поделиться

Преобразуйте выражение не аргументы.

select  CONVERT(DECIMAL(38,36),146804871.212533 / 12499999.9999)
3
ответ дан Arion 28 November 2019 в 22:41
поделиться

Короче говоря используйте ДЕСЯТИЧНОЕ ЧИСЛО (25,13), и Вы согласитесь со всеми вычислениями - Вы разберетесь в точности, как объявлено: 12 цифр перед десятичной точкой и 13 десятичными цифрами после. Правило: p+s должен равняться 38, и Вы будете на безопасной стороне! Почему это? Из-за очень плохой реализации арифметики в SQL Server! Пока они не фиксируют его, следуют тому правилу.

15
ответ дан 28 November 2019 в 22:41
поделиться

Я заметил, что если вы приведете значение деления к float, он даст вам правильный ответ, то есть:

select 49/30                   (result = 1)

станет:

select 49/cast(30 as float)    (result = 1.63333333333333)
12
ответ дан 28 November 2019 в 22:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: