NUMBER(x)可以包含多少位数,包括小数点后的数字?

时间:2014-12-10 11:53:51

标签: plsql sqldatatypes

对于plsql数据类型,NUMBER(x)想要知道它可以容纳的小数位后的最大位数(假设我在小数点前只使用了1位数)。是否有一些规则可以推导出来。

1 个答案:

答案 0 :(得分:0)

根据Oracle's documentation

  

<强>号

     

999 ...(38 9&#39; s)x10 125 最大值
  -999 ...(38 9&#39; s)x10 125 最小值

     

可以表示为完整的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