Oracle number类型的语法和用法

Oracle number类型的语法和用法Oraclenumber类型的语法和用法2012-10-2910:37:08    我来说两句     作者:liwenshui322收藏  我要投稿Oraclenumber类型的语法和用法    number类型的语法很简单,就是:   number(p,s)   p,s都是可选的,假如都不填,p默认为38,s默认为-48~127。

大家好,又见面了,我是你们的朋友全栈君。

Oracle 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、BINARY_FLOAT、BINARY_DOUBLE、BINARY_INTEGER、FLOAT

Oracle的数据类型转换 to_char(date)

Oracle 时间差计算【附加日期格式说明】

======================

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) 

======================

OracleNUMBER类型如果不指定长度和小数点精度默认是多长

Oracle中Number类型可以用来存储0,正负定点或者浮点数,可表示的数据范围在1.0 * 10(-130) —— 9.9…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 number 默认 百度

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/163928.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Arduino教程 RFID-RC522读IC卡门禁原理及破解防御[通俗易懂]

    【文章特色:1、提出IC卡破解原理和简单有效的防御方法2、网上其他文章对于硬件如何接线说得模糊不清】1、序言2、加载RC522库文件3、模块引脚接线4、程序代码5、运行结果先说下简单门禁系统的原理:(1)IC卡激活:门禁卡管理员将卡片放到读卡器、这时软件读取到IC卡的UID序列号信息(相当于身份证号码),将这个UID录入数据库激活IC卡。(2)刷卡

  • 兄弟连新版Linux视频教程

    兄弟连新版Linux视频教程兄弟连新版Linux视频教程目录:F:\linux\兄弟连新版Linux视频教程├(1)云计算是什么东西集群又是嘛玩意?.mp4├(2)兄弟连新版Linux教程1.1.1Linux系统简介-UNIX发展历史和发行版本.mp4├(3)兄弟连新版Linux教程1.1.2Linux系统简介-Linux发展历史和发行版本.mp4├(4)兄弟连新版Linux教程1.2Linux系统简介-开源软件…

  • Clover 引导 Windows 及 Linux 双系统

    Clover引导Windows及Linux双系统UEFIcnblogs@Orcim  此文比较详细地介绍了通过修改Clover的配置文件,添加Clover启动项的方法(添加Ubuntu启动项)。此文阅读前提,假定你已经完成安装Clover至硬盘EFI分区,Ubuntu已安装。为什么是CLOVER引导?一方面,…

  • 深度学习之GAN对抗神经网络

    深度学习之GAN对抗神经网络1、结构图2、知识点3、代码及案例#coding:utf-8###对抗生成网络案例#####<imgsrc="jpg/3.png"alt=&qu

  • jmeter常见面试题_hr面试问题大全及答案

    jmeter常见面试题_hr面试问题大全及答案问题列表在项目中如何用jmeter进行http接口测试?Jmeter常用元件有哪些?jmeter如何管理cookie和session信息?jmeter中如何实现关联?jmeter中断言方式?jmeter参数化的方式有哪几种可以实现?Jmeter怎么录制,怎么过滤?JMeter结果树响应数据中文乱码如何解决?用户定义的变量和用户参数的区别?Jmeter怎么实现持续集成测试?在项目中如何用jmeter进行http接口测试?(重点)在Jmeter安装目录bin中,找到jmet

  • 美国目前最流行的五种量化交易模型[通俗易懂]

    美国目前最流行的五种量化交易模型[通俗易懂]01、股票多空策略股票多空策略(EquityLong/Short),即买一些股票,通过融券的方式去卖空一些股票,然后再用一些股指期货进行对冲。这是国际上主流的HedgeFund所用的量化策略,据知名数据商Eurekahedge的统计数据,在国际对冲基金中长期占比第一(一直超过30%)。比如2011年获得美国量化基金业评比第一名的贝莱德“32Cap全球对冲基金产品”使用的就是经典的多空策略…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号