Как Oracle NUMBER может иметь шкалу больше точности? - PullRequest
5 голосов
/ 19 марта 2010

В документации говорится: «Точность может варьироваться от 1 до 38. Шкала может варьироваться от -84 до 127».

Как масштаб может быть больше точности?Разве масштаб не должен варьироваться от -38 до 38?

Ответы [ 6 ]

5 голосов
/ 19 марта 2010

Вопрос может быть почему нет?Попробуйте следующий SQL.

select cast(0.0001 as number(2,5)) num, 
       to_char(cast(0.0001 as number(2,5))) cnum,
       dump(cast(0.0001 as number(2,5))) dmp
  from dual

Вы видите, что вы можете хранить небольшие числа, это такая структура. Это может быть не очень часто, но я уверен, что где-то есть кто-то,точные, но очень маленькие цифры.

4 голосов
/ 18 августа 2017

Согласно документации Oracle:

Масштаб может быть больше точности, чаще всего, когда используется обозначение (где десятичная часть может быть настолько большой). Когда масштаб больше точности, точность определяет максимальное количество значащих цифр справа от десятичной точки. Например, для столбца, определенного как NUMBER(4,5), требуется ноль для первой цифры после десятичной точки и округление всех значений после пятой цифры после десятичной точки.

Вот как я это вижу:

  • Когда Precision больше, чем Scale (например, NUMBER(8,5)), нет проблем, это просто. Precision означает, что число будет содержать 8 цифр, 5 из которых находятся в дробной части (. →), поэтому целая часть (←.) Будет иметь 3 цифры. Это легко.
  • Когда вы видите, что Precision меньше, чем Scale (например, NUMBER(2, 5)), это означает 3 вещи:

    • Число не будет иметь целочисленной части, только дробную часть. Таким образом, 0 в целочисленной части не учитывается в вычислениях, вы говорите. 12345, а не 0,12345. Фактически, если вы укажете только 1 цифру в целочисленной части, она всегда будет возвращать ошибку.
    • Scale представляет общее количество цифр в дробной части, которое будет иметь число. 5 в этом случае. Таким образом, это может быть .12345 или .00098, но не более 5 цифр.
    • Дробная часть делится на 2 части, значащие числа и нули. Значимые числа задаются Precision, а минимальное количество нулей равно (Scale - Precision). Пример:

    здесь Число должно содержать не менее 3 нулей в дробной части. сопровождаемый 2 значащими числами (мог также иметь ноль). Таким образом, 3 нуля + 2 значащих числа = 5, что является Scale числом.

Вкратце, когда вы видите, например, NUMBER(6,9), это говорит нам о том, что дробная часть будет иметь всего 9 цифр, начиная с обязательных 3 нулей и заканчивая 6 цифрами.

Вот несколько примеров:

SELECT CAST(.0000123 AS NUMBER(6,9)) FROM dual;   -- prints: 0.0000123; .000|012300
SELECT CAST(.000012345 AS NUMBER(6,9)) FROM dual; -- prints: 0.0000123; .000|012345
SELECT CAST(.123456 AS NUMBER(3,4)) FROM dual;    -- ERROR! must have a 1 zero (4-3=1)
SELECT CAST(.013579 AS NUMBER(3,4)) FROM dual;    -- prints: 0.0136; max 4 digits, .013579 rounded to .0136
2 голосов
/ 06 июня 2016

Случай, когда Scale больше Precision, можно обобщить следующим образом:

Количество цифр справа от десятичной точки = Масштаб

Минимальное количество нулей справа от десятичной дроби = Масштаб - Точность

--this will work 
select cast(0.123456 as number(5,5)) from dual;

возвращает 0,12346

-- but this
select cast(0.123456 as number(2,5)) from dual;
--will return "ORA-1438 value too large".  
--It will not return err with at least 5-2 = 3 zeroes:
select cast(0.000123456 as number(2,5)) from dual;

возвращает 0,00012

-- and of course this will work too
select cast(0.0000123456 as number(2,5)) from dual;

возвращает 0,00001

2 голосов
/ 28 июня 2011

Согласно документации Oracle:

Масштаб может быть больше точности, чаще всего, когда используется электронная запись. Когда масштаб больше точности, точность определяет максимальное количество значащих цифр справа от десятичной точки. Например, для столбца, определенного как NUMBER (4,5), требуется ноль для первой цифры после десятичной точки и округление всех значений после пятой цифры после десятичной точки.

Рекомендуется указывать масштаб и точность столбца чисел с фиксированной точкой для дополнительной проверки целостности при вводе. Указание масштаба и точности не заставляет все значения фиксированной длины. Если значение превышает точность, Oracle возвращает ошибку. Если значение превышает масштаб, Oracle округляет его.

2 голосов
/ 20 марта 2010

Спасибо всем за ответы. Похоже, точность - это число значащих цифр.

 select cast(0.000123 as number(2,5)) from dual

Результат:

.00012

Где

 select cast(0.00123 as number(2,5)) from dual

и

 select cast(0.000999 as number(2,5)) from dual

оба результата:

ORA-01438: value larger than specified precision allowed for this column

2-й из-за округления.

0 голосов
/ 19 марта 2010

Хм, насколько я понимаю, точность - это количество цифр.
maximum precision of 126 binary digits, which is roughly equivalent to 38 decimal digits

В oracle есть тип NUMBER (точность, масштаб), где точность - это общее количество цифр, а шкала - это число цифр справа от десятичной точки. Масштаб может быть опущен, но это означает ноль. Точность может быть не указана (используйте, например, NUMBER (*, 10)) - это означает, что общее количество цифр соответствует нужному, но правильных 10 цифр

Если шкала меньше нуля, значение будет округлено до scale цифр слева от десятичной точки.
Я думаю, что если вы резервируете больше чисел справа от десятичной точки, чем может быть во всем числе, это означает что-то вроде 0,00000000123456, но я не уверен на 100%.

...