“四舍五入”是我們最早接觸的數學概念之一,數字取整也是我們最常接觸的一種需求樣式。在财務相關系統中,四舍五入的算法有時候對系統用戶造成巨大的影響。
在Oracle SQL中,提供了四種數字取整函數。從名稱上,他們都是在取整,但是具體算法有所不同。
這裡選擇Oracle 11gR2版本進行測試。
SQL> select * from v$version;
不同種類數據進行測試。
SQL> select * from t;
Oracle中的四種有取證功能函數為:ceil、floor、trunc和round,每一個都有不同的含義和特點,适合不同的場景。
2.1、ceil
Ceil的原始含義是說:返回比當前值大的第一個整數。這裡要注意“大”的概念,最簡單的理解就是我們數學上的數軸。Ceil就是返回當前值在數軸往右第一個整數值。
SQL> select id, ceil(id) from t;
這裡主要注意負數的ceil結果,和我們直觀的想法有一些差異。而且ceil并沒有進行四舍五入。
2.2、floor
Floor與ceil相對應,應該說是正好相反。ceil取定數軸右側的第一個整數值。而Floor取定的是數軸左側的第一個整數值,也就是取小的動作。
SQL> select id, floor(id) from t;
floor作用是找比當前值小的整數。
2.3、trunc
trunc是一個“多功能”函數。我們已經習慣其對date日期類型的處理方式。trunc輸入參數是日期類型時,起到的是裁斷天之後的時分秒信息。全部如期轉為00:00:00。但trunc面對數字類型輸入的時候,也會将小數點後面的數字截取。
SQL> select id, trunc(id) from t;
trunc對數字也沒有“四舍五入”的概念,都是直接“截斷處理”。
2.4、round
嚴格的說,隻有round才算真正有“四舍五入”的選擇動作。
SQL> select id, round(id) from t;
隻有round才有我們通常意義的四舍五入動作。
這些取整函數,一些可以帶一個可選參數,用來表示設置精度。當前我們數據為狀态如下:
SQL> select * from t;
trunc和round是可以支持函數scale參數的。
SQL> select id, trunc(id,1), round(id,1) from t;
如果設置正數,那麼返回的小數點後面的位數進行處理。如果我們設置負數呢?
SQL> select id, trunc(id,-1), round(id,-1) from t;
如果設置負數,就在小數點前面進行截取操作。
mod取餘數,我們經常用的“模”操作就是基于mod的操作。而remainder的功能也是取餘數,兩者有什麼差别呢?
SQL> select mod(11,4), remainder(11,4) from dual; SQL> select mod(0,4), remainder(0,4) from dual; SQL> select mod(-11,4), remainder(-11,4) from dual;
當取餘操作的兩個參數都是整數的時候,我們基本看出什麼問題。但是一旦出現負數,無論是除數還是被除數,mod的行為和經典餘數模型有一些不同。
SQL> select mod(-11,-4), remainder(-11,-4) from dual; SQL> select mod(11,-4), remainder(11,-4) from dual;
精确的說,mod的函數取值為:n2-n1*floor(n2/n1)。所以,要注意在存在負數的時候,mod的問題。
remainder也有取餘的效果,那麼有什麼不同的?要點就在計算公式的floor上面。對remainder而言,Oracle沒有選擇floor,而是round四舍五入。
Oracle提供了很多自定義函數,用好他們、用對他們,可以給予我們很大幫助。
後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注一下~
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!