NUMBER(x) 可以容纳多少位,包括小数点后?

Posted

技术标签:

【中文标题】NUMBER(x) 可以容纳多少位,包括小数点后?【英文标题】:How many digits including after decimal point can NUMBER(x) hold? 【发布时间】:2015-02-08 14:37:14 【问题描述】:

对于 plsql 数据类型 NUMBER(x) 想知道它可以容纳的小数点后的最大位数(假设我只使用小数点前的 1 位)。有什么规则可以推导出来吗?

【问题讨论】:

【参考方案1】:

根据Oracle's documentation:

NUMBER

999...(38 个 9's) x10125 最大值 -999...(38 个 9) x10125 最小值

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

【讨论】:

我的查询是关于以这种方式定义的变量:v_val number(11),对于这个例子,我怎么知道整数 vale 和十进制值中有多少位是可能的,因为我们已经定义了 11数字号码? number(11)number(11,0) 相同。即 11 位精度,刻度 0 - 换句话说,这是 integer 范围内的 [-99999999999 ; +99999999999]

以上是关于NUMBER(x) 可以容纳多少位,包括小数点后?的主要内容,如果未能解决你的问题,请参考以下文章

oracle中number类型 默认长度是多少

单精度小数点后面有几位?

数字保留2位小数

a-input-number 精确到小数点后6位

sqlserver 中保留小数点后多少位,用round

a-input-number 精确到小数点后6位