Как число Оракула может иметь Масштаб, превышающий Точность?

StackOverflow https://stackoverflow.com/questions/2473466

  •  20-09-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

Вопрос может заключаться в следующем : почему бы и нет ?Попробуйте следующий 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

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

Другие советы

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

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

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

  • Когда Precision больше, чем масштаб (например, 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).Пример :

    здесь число will должно содержать минимум 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

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

 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

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

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

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

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

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

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

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

--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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top