高手:number类型 的java int最大值是多少少

查看: 5364|回复: 4
不带精度的NUMBER类型究竟能存多少位长度的数据?
论坛徽章:0
NUMBER类型的字段定义时是可以不带精度的,而此时的NUMBER字段究竟能存多少位的数据呢,其上线是多少呢?我做了下面的一个小实验:
SQL& create table t01 (a number);
Table created.
--插入数据
SQL& declare
& && &&&delete from t01;
& && &&&i := 1;
& && &&&for x in 1 .. 101
& && &&&loop
& && && && && & insert into t01 values (i);
& && && && && &
& && &&&i:=i||'0';
/&&2& & 3& & 4& & 5& & 6& & 7& & 8& & 9& &10& &11& &12& &13& &14& &15&&
PL/SQL procedure successfully completed.
--上面的101是经过测试得到的,如果大于101,比如说102的话,会报错如下:
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 12
--查询此时表中最大值
SQL& select max(a) from t01;
& & MAX(A)
----------
1.000E+100
--统计一下长度
SQL& select length(a) from t01 order by length(a) ;
----------
& && && &1
& && && &2
& && && &3
& && && &4
& && && &5
& && && &6
& && && &7
& && && &8
& && && &9
& && &&&10
& && &&&11
----------
& && &&&12
& && &&&13
& && &&&14
& && &&&15
& && &&&16
& && &&&17
& && &&&18
& && &&&19
& && &&&20
& && &&&21
& && &&&22
----------
& && &&&23
& && &&&24
& && &&&25
& && &&&26
& && &&&27
& && &&&28
& && &&&29
& && &&&30
& && &&&31
& && &&&32
& && &&&33
----------
& && &&&34
& && &&&35
& && &&&36
& && &&&37
& && &&&38
& && &&&39
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
----------
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
----------
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
----------
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
----------
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
----------
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
& && &&&40
----------
& && &&&40
& && &&&40
101 rows selected.
发现到了40位的时候就不再增长了,非常的奇怪,不知道是为什么~
再就是前面的匿名块定义的循环,为什么不能大于101次?为什么报错的内容是字符的转换失败?
这个实验是否证明了不带参数的NUMBER类型字段,所能存储的最大长度是100位?
以上三个问题恳请大神出马帮我分析下
论坛徽章:381
参见文档和老杨的数值型存储格式帖子
论坛徽章:0
〇〇 发表于
参见文档和老杨的数值型存储格式帖子
跪求那篇贴子的url,找不到啊版主
论坛徽章:1088
论坛徽章:1088
老杨关于数据类型有一系列的文章,可以到他的blog里看或者去他的blog里搜索,或者google搜索
数据类型 yangtingkun
itpub.net All Right Reserved. 北京皓辰网域网络信息技术有限公司版权所有    
 北京市公安局海淀分局网监中心备案编号: 广播电视节目制作经营许可证:编号(京)字第1149号Number类型是oralce的数值类型,存储的数值的精度可以达到38位。Number是一种变长类型,长度为0-22字节。取值范围为:10^(-130) —— 10^126(不包括)。以十进制格式进行存储的,它便于存储,但是在计算上,系统会自动的将它转换成为二进制进行运算的。
Number(p,s):
P和s都是可选的。
P指精度(precision),即总位数。默认情况下精度为38。精度的取值范围为1~38。
S指小数位(scale),小数点右边的位数。小数点位数的合法值为-84~127。小数位的默认值由精度来决定。如果没有指定精度,小数位默认为最大的取值区间。如果指定了精度,没有指定小数位。小数位默认为0(即没有小数位)。
精度和小数位不会影响数据如何存储,只会影响允许哪些数值及数值如何舍入。
存储格式:
数字类型内部存储是一个字节的变长阿拉伯数字数组。
数字类型有以下格式:
& [length]&,sign bit/exponent,digit1,digit2,...,digit20
0&&&&&&&&&& digit1&&&&&&&&&&&&&&&& 21
第0个字节:
为符号和指数字节(sign bit/exponent ),由三部分构成:
(1)符号位:是整个字节的最高位(128)
& 如果是0,则数字是负数
& 如果是1,则数字是正数或者0
(2)偏移量:总是65
& 范围为-65到62
& 标示该数字100为基础的科学记数法
对于第0个字节的值,则有:正数&128;负数&128;零=128
记ZV=第0个字节的值,指数值为E则有:
若ZV=200,E=200-128-65=7
如果第一个字节大于128,那么数字是正的:
E=ZV- 128 -65=ZV-193
如果第一个字节小于128,那么数字是负的:
E=(255-ZV)-128-65=62-ZV
数值字节(Digits):
大部分数字的最高位是digit1
使用100作为基数(每一个数字是0-99之间)
对于正数:
& 实际值=存储值-1
对于负数:
& 实际值=101-存储值
& 标志102位于最后
11.11的存储格式为:
193,12,12
193&128,为正数,指数E=0,11(实际值)=12(存储值)-1
-11.11的存储格式为:
62,90,90,102
62&128,为负数,指数E=0,11(实际值)=101-90(存储值)
因为数字是基于100的,因此最大的数字是99.指数从-65到62,因此,oracle的number的范围为:1*100(-65)=1*10^(-130)到99*100(62)+99*100(61)……无限接近1*10^(126)。
正数的解读
数字为正数,第一个字节必须大于128(0x80)
第一步:指数= ZV(第0个字节的值)-193
第二步:每一个其他的数字都减1
第三步:从基于100的指数转换到基于10的指数
&&&&&& 每一个结果通过100^(EXP-N)其中
&&&&&& EXP是第一步中得到的指数
&&&&&& N是数字的位置的顺序号(最高位的N=0)
第四步:将所有的值相加
例:1234.12的存储:194,13,35,13
求值过程:
194&128,正数,E=1
实际值1234.12=(13-1)*100^1+(35-34)^0+(13-1)^(-1)
负数的解读
数字为负数,第一个字节必须小于128(0x80)
第一步:指数=62-ZV(第0个字节的值)
第二步:每一个数字被101减
第三步:将基数从100转换为10
&&&&&& 每一个数字乘以100^(EXP-N)这里
&&&&&& EXP是第一步中的指数值
&&&&&& N是数字位置顺序值(最高位为0)
第四部:确认尾巴上的102已经抛弃
第五步:将所有的值相加
如果数字标示超过21字节,则最后的102不被要求,oracle不会使用22字节来标示的。Oracle将自己会考虑所有的字节。
例:-1234.12的存储格式:61,89,67,89,102
求值过程:
61&128,负数,E=62-61=1
实际值-1234.12=-(& (101-89)*100^1+(101-67)*100^0+(101-89)*100^(-1)& )
阅读(...) 评论()

我要回帖

更多关于 java int最大值是多少 的文章

 

随机推荐