近期的工作中,使用報表的頻度越來越高,雖然展示數據更加方便了,但是報表加載數據時的各種問題也就迎之而來,最典型的問題:數字溢出;
先來看一下運行的錯誤日志:? ?
?故事背景:
這個問題發生在統計分析中,當把報表和存儲過程,程序之間的調用關系配置好之后,執行程序,就會出現上述圖中的問題;
?發展過程:
分析程序的運行日志,會發現程序調用存儲過程的時候已經執行成功了,而當報表加載數據集時提示“加載數據集失敗”,也就是說我們可以將問題的矛頭指向報表的配置了:比如參數配置,比如填報屬性的配置,比如各個字段的設置; ?
數字溢出問題:發生在統計分析中,所謂的數字溢出主要是指當前字段的大小無法滿足查詢到的數值(主要是位數,也就是精度上的大小區別);
所以主要有以下的解決方向:
1.view.xml在界面中,我們的field會設置類型,對于兩位小數,且金錢的使用18,3;所以簡單的float便不能滿足我們的需求,因此我們需要在下圖的位置對位數進行配置:
在view.xml中我們需要將貨幣型(且保留兩位小數)的字段設置為對應的類型,之所以會出現數字溢出的問題是因為,之前設置的datatype為float;而真正需要的是double,所以這里來溫習一下float和double的知識:
單精度浮點數(float)與雙精度浮點數(double)的區別如下:
(1)在內存中占有的字節數不同
? ? ? ? ? ??單精度浮點數在機內占4個字節
? ? ? ? ? ??雙精度浮點數在機內占8個字節
(2)有效數字位數不同
? ? ? ? ? ? ?單精度浮點數有效數字8位
? ? ? ? ? ? ?雙精度浮點數有效數字16位
(3)所能表示數的范圍不同
? ? ? ? ? ? ??單精度浮點的表示范圍:-3.40E+38 ~ +3.40E+38
? ? ? ? ? ? ??雙精度浮點的表示范圍:-1.79E+308 ~ +1.79E+308
(4)在程序中處理速度不同
? ? ? ? ? ? ? 一般來說,CPU處理單精度浮點數的速度比處理雙精度浮點數快
2.頁面中已經可以承載數據,但是統計分析的報表中無法承載查詢到的數據,所以我們需要將潤乾的顯示格式設置到可以顯示18,3和18,8的范圍:

**問題反思**
1.看來數字溢出這種出錯,有數字對應的類型溢出的意思,不過出錯信息還是少了點,而且拋的異常也沒有達成對應的出錯類,所以我們以后在架構的過程中可以嘗試著對該方面的類進行進一步的封裝,既可以打印日志又可以日志的指引作用更強;
2.數據庫使用的是oracle,id定義的類型為number,沒有定義精度,位數。一般定義Number的方法:Number(p,s),其中p,s都是可選的:
a、p代表精度,默認為38
b、s代表小數位數,取值范圍-84~127,默認取值要看是否指定了p,如果制定了p,默認s為0,如果沒有指定p,默認取最大值。
而目前的數據庫中默認,那么就是Number(38,0),所以隨著數據表中數據的增長,這會是個潛在的安全隱患。
3.再復習下數據庫字段定義的相關知識:
? ? ? 1> NUMBER(p,s):固定精度數字類型
? ? ? 2> NUMBER:不固定精度數字類型,當不確定數字的精度時使用,PK通常使用此類型
? ? ? 3> DATE:當僅需要精確到秒時,選擇DATE而不是TIMESTAMP類型
? ? ? ? ?VARCHAR2:變長字符串,最長4000個字節
? ? ?4> CLOB:當超過4000字節時使用,但是要求這個字段必須單獨創建到一張表中,然后有PK與主表關聯。此類型應該盡量控制使用;
雖然數字溢出的問題在我們處理數據的時候很常見,但是在解決問題時不能只局限于數字溢出,要補充和加深在其他方面的認識,這樣慢慢的知識網才能越補越結實;
