2015-04-24 4 views
0

У меня возникла проблема с точностью до максимального количества знаков после запятой. Если бы я произвел 6 разных чисел как numeric(36,18), тогда делайте расчеты между ними, результирующее значение обрезается в шести знаках после запятой. Если я использую float, я могу пойти гораздо дальше, но из того, что, как я слышал, тоже отрезаны.SQL Server - числовые и плавающие типы данных

Любая помощь будет большой, спасибо.

+0

Показать схему и код. –

+3

почему вы думаете, что результаты отрезаны в 6 местах? возможно, ваш выход сокращает его, но фактическое значение является правильным? –

+0

Это не проблема SQL Server. Вам нужно найти в Интернете множество статей, объясняющих поведение, различия между и относительными достоинствами типов данных с фиксированной точкой ('NUMERIC') и типа данных с плавающей точкой (' FLOAT'). Эти поведения существуют на разных языках и чрезвычайно ценны для понимания. – MatBailie

ответ

0

точность результата: [p1 - s1 + s2 + макс (6, S1 + р2 + 1)] -> 36-18 + 18 + макс (6,18 + 36 + 1) = 36 + 55 = 91 шкала результата: [max (6, s1 + p2 + 1)] -> max (6,18 + 36 + 1) = 55 В этой ситуации точность больше 38 и в этом случае (как указанная в документации)

* Точность и масштаб результата имеют абсолютный максимум 38. Если точность результата больше 38, соответствующая шкала уменьшается до , чтобы исключить усечение интегральной части результата.

шкала должна быть уменьшена (91-38) = 53, то есть (55-53 =) 2 ... минимальная длина шкалы составляет 6 (из-за экспрессии шкалы = [тах (6, S1 + p2 + 1)]) и не может быть уменьшена ниже 6 - , что мы имеем в результате

0

вещи может быть сложным, в зависимости от порядка расчетов.

Рассмотрим переменные:

DECLARE @A as NUMERIC(36,19) = 100 
DECLARE @B as NUMERIC(36,19) = 480 
DECLARE @C as NUMERIC(36,19) = 100 

Вычисление A/B * C

Если вы хотите вычислить A/B * C, используя formulaes (@Dudi ответ), мы имеем:

A/B имеет тип NUMERIC (38,6)

результат будет 0,208333 (с масштабом 6) умножения на 100, мы получим 20.833300

Вычисление A * C/B

Результат A * C 10000 типа NUMERIC (38,6). Дайвинг на C, результат будет 20.833333 типа NUMERIC (38,6)

Тогда результат может меняться в зависимости от порядка расчета (та же проблема была указана в https://dba.stackexchange.com/questions/77664/how-does-sql-server-determine-precision-scale).

SQL Fiddle

+0

Спасибо всем. Я понятия не имел, насколько это сложно. – hitachi7

Смежные вопросы