Oracle number类型前端界面和数据库查询不一致 number精度问题

 

【发现问题】

  

 

【问题分析】

  Ⅰ、在前端界面查询,发现了库存中存在这样的数量值。但是在数据库中查询时显示正常。即6.999999999999997 为 7。

  Ⅱ、至于这种小数产生,我以为是oracle存储过程计算的时候也会失真?后来发现我这是由于其他问题造成的。

  🌂对于前端和数据库的查询结果不一致,我也很纳闷。于是,我把数据里面的7,进行重写,这样前端就显示正常了。于是我推断,前端界面显示的数据库值是准确的,而我们查询的结果进行了一些处理,导致6.999999999999997查看到的结果是7。

  Ⅳ、数据库会默认6.999999999999997为Number,查询的结果如下:

    

  

  🌫如果我们将Number类型的数据进行一个to_char的处理,如下:(可以发现,数据完整显示)

    

 

  ⑥前端显示 2E-12 ,那么它实际的值是多少呢?可以通过  to_char() 来显示它原来的值。最后发现0.000000000002这样的值,number类型显示如下:

     

  

【知识补充】

  ①百度知识

  •   Oracle Number类型是以十进制形式存储整数和浮点数,语法为 Number( p , s ) 。
  •   其中 p 为精度,即所有有效数字位数; s 为刻度范围,即小数位数。 p 的取值范围是  1~38,s的取值范围范围从-84127
  •   在此我也查询了一些资料,精度和刻度的限制是在插入时,根据精度和刻度对插入的值进行一个四舍五入的处理以及限制。并没有提到和 select 查询的关系。

  

   PS:看完这写也并不知道说的是···,感觉自己没用到这东西。但是大概的意思是:

  •    我们是设计数据库的时候,常用的类型用 VARCHAR2 类型,一般我们会指定 字符的长度,好像是必须指定的。但是 Number 类型我们一般不设置他的精度和刻度范围。

      

  •  那么这个精度和刻度就是像 VARCHAR2 写法相同。如下:

      

  •     p设置为0,s设置大于0,会提示类型不正确
       NUMBER(0,5)
  •     p设置为大于0,s设置0,显示为 Number(p)
  •        NUMBER(5,-2) 表示有效位为5位,小数点左边两位进行四舍五入。即 插入11268  存11300
  •   NUMBER(5,2) 表示有效位5位,小数位后最多两位进行四舍五入。即插入 123.356 存 123.36 
  •   如果四舍五入后的位数超过最大有效位置,将会出错。即 NUMBER(5,-1) 插入 99999 四舍五入之后 100000 超过有效位数出错。
  •   保留到小数点后几位不看有效位数。
    NUMBER(*,1)

 

  ②我们一般会直接使用Number类型,那么默认的 精度和刻度 又是多少呢?

  •   创建一张表作为测试
    create Table num_dome ( 
        NUM_VAL NUMBER 
    );
  •   将数据类型设置为NUMBER类型,我们插入一个除不尽的小数,以此来判断它的最大刻度。
    insert into num_dome values (2/3)

    

    PS: 最大精度38,这里小数位后有39位什么意思?

  • select 查询查看显示结果(小数点后15位)

     

 

  •   插入一个大于10的小数(前面两位,小数点后37位。数字位39位和上方相同)

    

  •   查看查询的关系(数字位数为15位)

    

 

【问题思考】

  • 插入的值是有小数的,并且不为0 ,说明刻度 s  大于0 ,若 s>0 那么最大有效位为 p,即39??p的取值范围为 1~38 ?
  • 若 p就为39,那么 s 的值好像是变化的 s=39-p。他们是否存在这样的一个动态关系?是否 s 一定要是一个明确的数字?
  • select查询和数据库存储相同,只不过把位数缩短了,取15位进行显示。

 

  这些问题其实并没有太大的影响,但一直想弄明白。包括也查了一些资料,并没有得到确切的答案。

  本文是自己对Number类型精度刻度的思考,如有错误,请务必告知。(这篇一直零散的写了几天,一直在想通过什么样的方式去测试,以及能够得出什么样的结论)

 

 

 

posted @ 2019-08-13 13:10  茄子鱼  阅读(2386)  评论(0编辑  收藏  举报