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
,然后是12345678901
和12345678901
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) 可以容纳多少位,包括小数点后?的主要内容,如果未能解决你的问题,请参考以下文章