2014-12-10 4 views
0

Для типа данных plsq NUMBER (x) требуется знать максимальное количество цифр после десятичного места, которое оно может удерживать (при условии, что я использую только 1 цифру до десятичной точки). Есть ли какое-то правило, с помощью которого это можно получить.Сколько цифр, включая после десятичной точки, может удерживать NUMBER (x)?

ответ

0

По Oracle's documentation:

НОМЕР

999 ... (38 9 в) x10 максимальное значение
-999 ... (38 9 в) x10 минимальное значение

Может быть представлено до полной 38-значной точности (мантиссы).

Проще говоря, у вас есть 38 значащих (десятичных) цифр.

Учитывая ваш случай, если вы используете 1 цифра перед тем десятичную точку, вы по-прежнему иметь в своем распоряжении при макс 37 цифр сразу после десятичной точки:

NUMBER(38,37) 

Это будет охватывать диапазон:

-9.9999999999999999999999999999999999999 
+9.9999999999999999999999999999999999999 

с ULP из:

0.0000000000000000000000000000000000001 

Это лучше с точки зрения точности, чем IEEE754 floating point numbers, и у вас будет точное представление десятичных чисел.


В качестве побочного сведению, несколько вещей, чтобы знать:

  • NUMBER(x) это то же самое, как NUMBER(x,0). Это знак десятичного знака целое число.
  • PL/SQL будет отбрасывать числа после десятичного разделителя при выполнении привязки к числу со шкалой, меньшей, чем оригинал. увидеть этот пример:

    declare 
        n1 number(12,1); 
        n2 number(11); 
    begin 
        n1 := 12345678901.2; 
        dbms_output.put_line(n1); 
        n2 := n1; -- loose precision here !!! 
        n1 := n2; 
        dbms_output.put_line(n1); 
        dbms_output.put_line(n2); 
    end; 
    

    12345678901.2 Отображение, а затем и 1234567890112345678901

  • Оператор CAST будет вести себя точно таким же образом:

    select CAST(12345678901.2 AS NUMBER(11)) FROM DUAL; 
    

    , что приводит к 12345678901.

+0

Мой запрос относился к переменным, определенным таким образом: v_val number (11), для этого примера, как бы я знал, сколько цифр в целочисленном и десятичном значении возможно, поскольку мы определили 11-значное число ? – shadow0wolf

+1

'number (11)' - это то же самое, что и 'number (11,0)'. То есть точность в 11 цифр, масштаб 0 - другими словами, это [** integer **] (http://en.wikipedia.org/wiki/Integer) в диапазоне '[-99999999999; +99999999999] '. –

+0

ok, я получил его сейчас, ty – shadow0wolf