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類型精度刻度的思考,如有錯誤,請務必告知。(這篇一直零散的寫了幾天,一直在想通過什么樣的方式去測試,以及能夠得出什么樣的結論)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM