Oraclenumber类型的语法和⽤法
number类型的语法和⽤法
摘要:先根据精度值,对number类型的数据从左边第⼀个⾮零数字开始数精度值个位数,之后的位数截断不要(要四舍五⼊吗),再根据⼩数位置值,对number类型的数据右边的低位进⾏四舍五⼊(如果⼩数位置值为负的,如何处理?)
number类型的语法很简单,就是:
number(p,s)
p,s都是可选的,假如都不填,p默认为38,s默认为-48~127。
1. 精度(precision),或总位数。默认情况下,精度为38位,取值范围是1~38之间。也可以⽤字符*表⽰38。
2. ⼩数位置(scale)
当s(scale)为正数时,Oracle就对⼩数点右边的s个数字进⾏舍⼊。精确到⼩数点右边s位,并四舍五⼊。然后检验有效数位是否<=p;如果s>p,⼩数点右边⾄少有s-p个0填充。
当s(scale)为负数时,Oracle就对⼩数点左边的s个数字进⾏舍⼊。精确到⼩数点左边s位,并四舍五⼊。然后检验有效数位是否<=p+|s|
⼩数位数的合法值为-48~127,其默认值取决于是否指定了精度:
如果没有知道精度,则⼩数位数的取值默认可以落在最⼤的取值区间,即-48~127【Oracle 11g r2上,不只为127,但貌似⼩于140】上。
如果指定了精度,且指定了⼩数位数为n,则⼩数位数的取值可以落在取值区间0~n上。
如果指定了精度,⽽没有写出⼩数位数,则⼩数位数默认为0(⼩数点右边⼀位都没有)。
例如,定义为NUMBER的列会存储浮点数(有⼩数),⽽NUMBER(38)只存储整数数据(没有⼩数),因为在第⼆种情况下⼩数位数默认为0.
注释:
1、
对于number(p,s)格式的数值,该数值中的哪些位数算为精度值位数呢?
回答该问题,⾸先我们要确定第|s|位数字为是哪⼀位?
当刻度s为负数时,Oracle就对⼩数点左边开始向前数的第|s|位数字是第|s|位数字,并对该数字进⾏四舍五⼊。例如,对于数据类型为number(5,-3)的列,输⼊数值1267.9,则Oracle就会判断出数值1267.9的第|s|位数字为2,之后对该数字2进⾏四舍五⼊,由于2⼩于5,所以第|s|位数字相邻左边⼀个数字1不变没有增⼀,⽽(四舍五⼊后)从第|s|位数字算起其右边的所有数字都置为0,故最后实际存储到列⾥的值为1000(显⽰屏幕上的不是1000.0形式)。因此,当刻度s为负数时,存⼊数据类型为number(p,s)的列的最终值都是整数形式,⽆论你输⼊的是否带有⼩数。
再例如,
如果scale是负数怎么样,表⽰左边整数位舍⼊⼏位:
create table t ( msg varchar2(12.),num_col number(5,-2) );
insert into t (msg,num_col) values ('123.45', 123.45 );//执⾏成功,保存的是100
insert into t (msg,num_col) values ('123.456', 123.456 );//执⾏成功,保存的是100
当刻度s为正数时,Oracle就对⼩数点右边开始向前数的第|s|位数字是第|s|位数字,并对该数字右边相
邻⼀位数字进⾏四舍五⼊。例如,对于数据类型为number(5,3)的列,输⼊数值4.5679,则Oracle就会判断出数值4.5679的第|s|位数字为7,之后对该数字7右边相邻⼀位数字即9进⾏四舍五⼊,由于9⼤于5,所以第|s|位数字7变为8,⽽(四舍五⼊后)第|s|位数字右边的所有数字都置为0,故最后实际存储到列⾥的值为4.568(显⽰屏幕上的不是4.5680形式)。再例如,
create table t ( msgvarchar2(12.), num_col number(5,2) );
insert into t (msg,num_col) values ( '123.456', 123.456);//执⾏成功,保存的是123.46
当确定了第|s|位数字为是哪⼀位后,我们从第|s|位数字左边相邻的⼀个数字算起数p个数字,这p个数字就为为精度值p所作⽤的范围。这也就是为什么当刻度s为负数时存⼊数据类型为number(p,s)的列的最终值的位数最⼤(即有效数位)可为p+|s|,⽽不是为p。例如,例如,对于数据类型为number(5,-3)的列,输⼊数值11111667.9,则最终值为11112000.
简⽽⾔之,
当刻度s为正数时,⼩数点左边的最⼤位数为p-s,⽆论此时输⼊的数值的⼩数点右边的位数是否达到s或说这与输⼊的数值的⼩数点右边的位数为多少⽆关。例如:
create table t ( msg varchar2(12.), num_col number(5,2));
insert into t (msg,num_col) values ( '1234', 1234 );//执⾏失败,要保留2位⼩数,那么整数位最多3位,现在是4位。
当刻度s为负数时,⼩数点左边的最⼤位数为p+|s|,且这与输⼊的数值的⼩数点右边的位数为多少⽆关。
2、
P只能为正数。
当刻度s为正数时,
P<s时,写⼊不了值,提⽰ora-01438。
当刻度s为负数时,
P<|S|时,
如果输⼊的数值,其后⼩数点左边的位数不⼤于|S|,且最⾼位数字⼩于5,则存储的最终值都为0。因为例如,对于数据类型为number(3,-5)的列,输⼊数值64.8(我们可以将之视为0000000064.8,其
中0的个数随便添加只要0**064.8的整数位数⼤于等于|s|),则Oracle就会判断出数值4.5679的第|s|位数字为0(即6左边第三个的那个零),之后对该数字0进⾏四舍五⼊,由于0⼩于5,所以第|s|位数字相邻左边⼀个数字0不变没有增⼀,⽽(四舍五⼊后)从第|s|位数字算起其右边的所有数字都置为0,故最后实际存储到列⾥的值为0。
如果输⼊的数值,其后⼩数点左边的位数⼤于|S|,则存储的最终值中除第|s|位数字左边所有数字不变外其他数字都置为0。因为例如,对于数据类型为number(3,-5)的列,输⼊数值123456.7,则Oracle就会判断出数值123456.7的第|s|位数字为2,之后对该数字2进⾏四舍五⼊,由于2⼩于5,所以第|s|位数字相邻左边⼀个数字1不变没有增⼀,⽽(四舍五⼊后)从第|s|位数字算起其右边的所有数字都置为0,故最后实际存储到列⾥的值为100000。
如下SQL语句:
create table t ( msg varchar2(12.), num_col number(5,2) );
insert into t (msg,num_col) values ( '123.456', 123.456 );//执⾏成功,保存的是123.46
insert into t (msg,num_col) values ( '1234', 1234 );//执⾏失败,要保留2位⼩数,那么整数位最多3位,现在是4位。
如果scale是负数怎么样,表⽰左边整数位舍⼊⼏位:
create table t ( msg varchar2(12.), num_col number(5,-2) );
insert into t (msg,num_col) values ( '123.45', 123.45 );//执⾏成功,保存的是100
insert into t (msg,num_col) values ( '123.456', 123.456 );//执⾏成功,保存的是100
其他数据类型:
1. NUMERIC(p,s):完全映射⾄NUMBER(p,s)。(即NUMERIC(p,s)是NUMER(p,s)的⼀个⼦集)如果p未指定,则默认为38.
2. DECIMAL(p,s)或DEC(p,s):完全映射⾄NUMBER(p,s)。如果p为指定,则默认为38.
3. INTEGER或INT:完全映射⾄NUMBER(38)类型。
4. SMALLINT:完全映射⾄NUMBER(38)类型。
5. FLOAT(b):映射⾄NUMBER类型。
6. DOUBLE PRECISION:映射⾄NUMBER类型。
7. REAL:映射⾄NUMBER类型。
性能考虑:
⼀般⽽⾔,Oracle NUMBER类型对⼤多数应⽤来讲都是最佳的选择。不过,这个类型会带来⼀些性能影响。Oracle NUMBER类型是⼀种软件数据类型,在Oracle软件本⾝中实现。我们不能使⽤固有硬件操作将两个NUMBER类型相加,这要在软件中模拟。不过,浮点数没有这种实现。将两个浮点数相加时,Oracle会使⽤硬件来执⾏运算。
换⽽⾔之,将⼀些列的number列相加,没有将⼀系列float列相加来得快。因为float列的精度低很多,⼀般是6~12位。
⽐如:select sum(ln(cast( num_type as binary_double ) )) from t
⽐:select sum(ln(cast( num_type) )) from t 要快很多。
======================
oracle number(p,s) 说明
2008-06-03 17:17:54| 分类:|举报|字号
oracle的Number(p,s)的意义
p 效数位:从左边第⼀个不为0的数算起
如 0.01234567 NUMBER(4,5) 其实存储结果为 0.01235
number(p,s)
p:1~38
s:-84~127
p>0,对s分2种情况:
1. s>0
精确到⼩数点右边s位,并四舍五⼊。然后检验有效数位是否<=p;如果s>p,⼩数点右边⾄少有s-p个0填充。
2. s<0
精确到⼩数点左边s位,并四舍五⼊。然后检验有效数位是否<=p+|s|
⽐如:
Value Datatype Stored Value
123.2564 NUMBER 123.2564
1234.9876 NUMBER(6,2) 1234.99
12345.12345 NUMBER(6,2) Error
错误原因 12345.12345 按后⾯的⼩数点必须保留两位 12345.12 这样总位数7位数字超过了6,相互冲突了。
同样的原理 如果设计数据为2234563,但是设置 NUMBER(6) 也会导致⼀个错误
1234.9876 NUMBER(6) 1235
12345.345 NUMBER(5,-2) 12300
1234567 NUMBER(5,-2) 1234600
12345678 NUMBER(5,-2) Error
123456789 NUMBER(5,-4) 123460000
1234567890 NUMBER(5,-4) Error
12345.58 NUMBER(*, 1) 12345.6
0.1 NUMBER(4,5) Error
0.01234567 NUMBER(4,5) 0.01235
0.09999 NUMBER(4,5) 0.09999
0.099996 NUMBER(4,5)
======================
在中Number类型可以⽤来存储0,正负定点或者浮点数,可表⽰的数据范围在1.0 * 10(-130) —— 9 * 10(125) {38个9后边带88个0}的数字,当Oracle中的数学表达式的值>=1.0*10(126)时,Oracle就会报错。
Number的数据声明如下:
表⽰ 作⽤ 说明
Number(p, s) 声明⼀个定点数 p(precision)为精度,s(scale)表⽰⼩数点右边的数字个数,精度最⼤值为38,scale的取值范围为-84到127
Number(p) 声明⼀个整数 相当于Number(p, 0)
Number 声明⼀个浮点数 其精度为38,要注意的是scale的值没有应⽤,也就是说scale的指不能简单的理解为0,或者其他的数。
定点数的精度(p)和刻度(s)遵循以下规则:
当⼀个数的整数部分的长度 > p-s 时,Oracle就会报错
当⼀个数的⼩数部分的长度 > s 时,Oracle就会舍⼊。
当s(scale)为负数时,Oracle就对⼩数点左边的s个数字进⾏舍⼊。
当s > p 时, p表⽰⼩数点后第s位向左最多可以有多少位数字,如果⼤于p则Oracle报错,⼩数点后s位向右的数字被舍⼊
oracle四舍五入参考:
oracle number 默认 百度
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论