oracle 存储负数的类型,oracle number类型内部存储的指数基数为何是100?负数的后面数字为何以101作为标准?...

结论:

1,        NUMBER的类型编码Typ为2

2,        如果数值为负数那么需要在最后面补一位102,正数和零则不需要

之所以这样处理,是为了更加方便的进行两个数值的大小比较。Oracle在进行数据库中两个数值大小比较的时候,直接比较他们在数据库中的存储格式,并不是把他们转化成我们常用的数值形式后在比较。比如说:比较0和1这两个数,0在数据库中表示为128,1在数据库中表示为193,2,那么直接进行比较‘128’小于‘193’,所以0肯定比1要小。在比如说1和0.12这两个数比较,0.12在数据库中表示为192.13,因为‘193’大于‘192’,所以1肯定比0.12大。这个规则对于正数和0完全适用,但是对于不补位的负数就要出麻烦了。看下面的例子:

SQL> select dump(-0.12) from dual;

DUMP(-0.12)

----------------------

Typ=2 Len=3: 63,89,102

SQL> select dump(-0.125) from dual;

DUMP(-0.125)

-------------------------

Typ=2 Len=4: 63,89,51,102

如果不补位的话-0.12应该为63,89,而-0.125应该为63,89,51,那么按照前面的规则来说‘63’等于‘63’,‘89’等于‘89’,‘51’肯定要大于空,就可以得出错误的结论-0.12小于-0.125。而当在负数后面补上102后,情况就完全改变了,就可以很快的得到正确的大小关系。

3,        转化规则

(1)数值在数据库中存储结构的第一位叫做标志位,是整个数值表示中最关键的一位。

如果标志位大于128,那么该数值为正数

如果标志位等于128,那么该数值为0

如果标志位小于128,那么该数值为负数

例如:

数值0的标志位为128,所以为0

数值0.12的标志位为192,所以0.12为正数

数值-34.56的标志位为62,所以-34.56为负数

(2)数据库中存储结构的除了第一位其余的为数值位

如果该数值为正数,那么每位上的实际数值等于数据库中存储的数值减1

如果该数值为负数,那么每位上的实际数值等于101减去数据库中存储的数值,最后补位的102不用计算。

例如:

数值1的数字为2 – 1 = 1

数值-1的数字为 101 – 100 = 1

数值34.56的数字为35 – 1 = 34,57 – 1 = 56,即3456

数值-34.56的数字为101 – 67 = 34,101 – 45 = 56,即3456

(3)确定小数点位置

确定小数点的位置需要标志位和第一位共同来决定

如果该数值为正数,那么该数值的前几位应该为第一位 * power(100,(标志位 – 193))

如果该数值为负数,那么该数值的前几位应该为第一位 * power(100,(62–标志位))

例如:

34.56 Typ=2 Len=3: 193,35,57,该数值的前几位应该为34*power(100,0)=34,所以34.56的小数点应该在4的后面,那么就可以得到该数值为34.56

-34.56 Typ=2 Len=4: 62,67,45,102该数值的前几位应该为34*power(100,0)=34,所以34.56的小数点应该在4的后面,那么就可以得到该数值为-34.56

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值