【發現問題】
【問題分析】
Ⅰ、在前端界面查詢,發現了庫存中存在這樣的數量值。但是在數據庫中查詢時顯示正常。即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的取值范圍范圍從
-84
到127
- 在此我也查詢了一些資料,精度和刻度的限制是在插入時,根據精度和刻度對插入的值進行一個四舍五入的處理以及限制。並沒有提到和 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類型精度刻度的思考,如有錯誤,請務必告知。(這篇一直零散的寫了幾天,一直在想通過什么樣的方式去測試,以及能夠得出什么樣的結論)