oracle 補齊兩位小數(不足補0)


1.情景展示

在Oracle當中,進行加減乘除運算時,如何保留兩位小數?

當不足兩位小數時,如何進行補0?

2.具體分析

從數據源進行管控

如果是從數據源上進行管理,我們可以直接定義要保存的數據的格式(需要幾位小數)提前定義好。

比如,規定數據格式為:保留兩位小數。

number(10,2)代表的含義是:整數位+小數位<=10且小數位=2(言外之意就是:整數位需要<=8)。

我們可以看到:當我們插入的數據不足兩位小數時,將會自動用0補夠;

當插入的數據小數位超過要保留的位數時,會自動對小數位進行四舍五入操作。

另外,關於number類型,還有一個特性:

當整數部分最前面有0時,Oracle會自定將其刪除,這個java的int/long數據類型一樣,都無法在整數前面加0;

如果,我們需要在整數最前面補零的話,可以將數據類型改成varchar2。

基於現有數據的管控

即使,我們按照上面的規矩對數據進行了約束,但是,一旦我們需要進行除法運算,除不盡或者小數位超過兩位的情況很常見;

下面,會着重介紹,這類現象的解決方案。

3.解決方案

保留兩位小數的兩種方式:trunc()與round()

trunc()函數

用途:單純地對數字進行截取處理,不做四舍五入操作

語法:TRUNC(number[,decimal_places])

參數說明:        

       number 待做截取處理的數值

       decimal_places 指明需保留小數點后面的位數。可選項,不帶該參數時,截去所有的小數部分。

舉例:

--情景1:參數帶小數,不帶第2個參數
SELECT TRUNC(123) FROM DUAL;--123 
SELECT TRUNC(123.98) FROM DUAL; --123
--情景2:參數是整數,保留1位小數
SELECT TRUNC(123, 1) FROM DUAL; --123
--情景3:參數帶小數,保留2位小數
SELECT TRUNC(123.123, 2) FROM DUAL; --123.12
--情景4:參數帶小數,保留4位小數
SELECT TRUNC(123.123, 4) FROM DUAL;--123.123
--情景5:保留到十位
SELECT TRUNC(123.123, -1) FROM DUAL; --120
SELECT TRUNC(123, -1) FROM DUAL; --120
--情景6:保留到小數點前 5位
SELECT TRUNC(123.123, -5) FROM DUAL; --0

用法:        

     1.不帶第二個參數,默認只保留整數位,不做四舍五入操作,單純截取;
     2.帶第二個參數:
          2.1 當參數為正數時:
            2.1.1 當要保留的小數位 < 要截取的小數位數時,直接截取;
            2.1.2 當要保留的小數位 >= 要截取的小數位數時,返回原數字。
          2.2 當參數為負數時:
            2.2.1 當要保留的整數位 < 要截取的整數位數時,從整數的個位倒序(個,十,百...位)直接截取;
            2.2.2 當要保留的整數位 >= 要截取的整數位數時,返回0。

round()函數

用途:和tranc()函數的用法大致相同,不同的是:使用該函數會以四舍五入的方式進行截取。

語法:ROUND(number[,decimal_places])

參數說明:        

       number 待做截取處理的數值

       decimal_places 指明需保留小數點后面的位數。可選項,不帶該參數時,截去所有的小數部分。

方式一:to_char()函數

to_char()可以使用9或0,對數字進行格式化處理。

0:在對應位置返回對應的字符,如果沒有則以'0'填充;

注意,這是一個強制的符號:對應位沒有,則以'0'填充(包括整數部分)。

9:在小數位,則表示轉換為對應字符;如果沒有,則以0表示。(只對小數部分有效:在整數位,沒有對應,則不填充字符)。

使用to_char()函數,0或9進行格式化的弊端:

第一,會在格式化后的數據前面產生空格。

需要使用trim()函數進行去除

第二,使用9進行格式化小數時,如果整數部分全部為0,將會出現錯的結果;

需要使用decode()函數對0進行單獨處理

第三,整數部分的格式化位數必須<=整數部分的位數,否則返回#

注意事項:對於0和9而言,如果格式的位數<數字的位數,會返回'#'.
譬如to_char(12345,'9999')將會得到:'#####'。

 另外,當數值的小數位數>要格式化(保留)的小數位時,會自定按照四舍五入處理。

語法小結:

保留兩位小數,不進行四舍五入

decode(column, 0, '0.00', trim(to_char(trunc(column, 2), '9999999.99')))

保留兩位小數,進行四舍五入

decode(column, 0, '0.00', trim(to_char(column, '9999999.99')))

或者

decode(column, 0, '0.00', trim(to_char(round(column, 2), '9999999.99')))

 如果需要對整數位進行補零操作,我們可以使用:

decode(column, 0, '00.00', trim(to_char(column, '00.99')))

我們知道使用0進行格式化,整數部分<格式化的整數部分位數時,會自動整數部分補零;

但是,我們可以利用number類型的特性(整數最前面不能帶0)來將最前面的0過濾掉。

decode(column, 0, 0.00, trim(to_char(column, '00.99')))

這個方法的關鍵點在於:0.00,它將trim(to_char())函數結果轉成了number類型。

說明:不管是用0還用9進行格式化時,只要確保對整數部分進行格式化是,0或9的整數部分個數>=整數部分的位數。

方式二:cast()函數

語法:cast(column as number(最大位數, 小數位數))。

當數值的小數位數>要格式化(保留)的小數位時,會自定按照四舍五入處理。

說明:number(total, remainder)需要總數位>小數位(即第一個參數的值需要>第二個參數的值)。

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:


免責聲明!

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



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