聊聊四種Oracle數字取整函式
“四捨五入”是我們最早接觸的數學概念之一。我們日常開發系統中,數字取整也是我們最常接觸的一種需求樣式。在財務相關係統中,四捨五入的演算法有時候對系統使用者造成巨大的影響。
在Oracle SQL中,提供了四種數字取整函式。從名稱上,他們都是在取整,但是具體演算法有所不同。在本篇裡面,我們進行一下詳細的分析。
1、環境介紹和準備
我們依然選擇Oracle 11gR2版本進行測試。
SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE 11.2.0.1.0 Production
不同種類資料進行測試。
SQL> create table t (id number);
Table created
SQL> select * from t;
ID
----------
0
1
1.3
1.5
1.8
-1
-1.3
-1.5
-1.8
9 rows selected
2、四種基本取整函式
Oracle中的四種有取證功能函式為:ceil、floor、trunc和round,每一個都有不同的含義和特點,適合不同的場景。
Ceil的原始含義是說:返回比當前值大的第一個整數。這裡要注意“大”的概念,最簡單的理解就是我們數學上的數軸。Ceil就是返回當前值在數軸往右第一個整數值。
SQL> select id, ceil(id) from t;
ID CEIL(ID)
---------- ----------
0 0
1 1
1.3 2
1.5 2
1.8 2
-1 -1
-1.3 -1
-1.5 -1
-1.8 -1
9 rows selected
這裡主要注意負數的ceil結果,和我們直觀的想法有一些差異。而且ceil並沒有進行四捨五入。
Floor與ceil相對應,應該說是正好相反。ceil取定數軸右側的第一個整數值。而Floor取定的是數軸左側的第一個整數值,也就是取小的動作。
SQL> select id, floor(id) from t;
ID FLOOR(ID)
---------- ----------
0 0
1 1
1.3 1
1.5 1
1.8 1
-1 -1
-1.3 -2
-1.5 -2
-1.8 -2
9 rows selected
floor作用是找比當前值小的整數。
trunc是一個“多功能”函式。我們已經習慣其對date日期型別的處理方式。trunc輸入引數是日期型別時,起到的是裁斷天之後的時分秒資訊。全部如期轉為00:00:00。但trunc面對數字型別輸入的時候,也會將小數點後面的數字擷取。
SQL> select id, trunc(id) from t;
ID TRUNC(ID)
---------- ----------
0 0
1 1
1.3 1
1.5 1
1.8 1
-1 -1
-1.3 -1
-1.5 -1
-1.8 -1
9 rows selected
trunc對數字也沒有“四捨五入”的概念,都是直接“截斷處理”。嚴格的說,只有round才算真正有“四捨五入”的選擇動作。
SQL> select id, round(id) from t;
ID ROUND(ID)
---------- ----------
0 0
1 1
1.3 1
1.5 2
1.8 2
-1 -1
-1.3 -1
-1.5 -2
-1.8 -2
9 rows selected
只有round才有我們通常意義的四捨五入動作。
3、取整函式的精度scale取值
我們這些取整函式,一些可以帶一個可選引數,用來表示設定精度。當前我們資料為狀態如下:
SQL> select * from t;
ID
----------
1234.4345
1234.4392
-1234.4392
-1234.4345
trunc和round是可以支援函式scale引數的。
SQL> select id, trunc(id,1), round(id,1) from t;
ID TRUNC(ID,1) ROUND(ID,1)
---------- ----------- -----------
1234.4345 1234.4 1234.4
1234.4392 1234.4 1234.4
-1234.4392 -1234.4 -1234.4
-1234.4345 -1234.4 -1234.4
如果設定正數,那麼返回的小數點後面的位數進行處理。如果我們設定負數呢?
SQL> select id, trunc(id,-1), round(id,-1) from t;
ID TRUNC(ID,-1) ROUND(ID,-1)
---------- ------------ ------------
1234.4345 1230 1230
1234.4392 1230 1230
-1234.4392 -1230 -1230
-1234.4345 -1230 -1230
如果設定負數,就在小數點前面進行擷取操作。同時,floor和ceil不支援第二個引數。
SQL> select id, ceil(id,1), floor(id,1) from t;
select id, ceil(id,1), floor(id,1) from t
ORA-00909: 引數個數無效
SQL> select id, floor(id,1) from t;
select id, floor(id,1) from t
ORA-00909: 引數個數無效
4、mod與remainder
mod取餘數,我們經常用的“模”操作就是基於mod的操作。而remainder的功能也是取餘數,兩者有什麼差別呢?
SQL> select mod(11,4), remainder(11,4) from dual;
MOD(11,4) REMAINDER(11,4)
---------- ---------------
3 -1
SQL> select mod(0,4), remainder(0,4) from dual;
MOD(0,4) REMAINDER(0,4)
---------- --------------
0 0
SQL> select mod(-11,4), remainder(-11,4) from dual;
MOD(-11,4) REMAINDER(-11,4)
---------- ----------------
-3 1
當取餘操作的兩個引數都是整數的時候,我們基本看出什麼問題。但是一旦出現負數,無論是除數還是被除數,mod的行為和經典餘數模型有一些不同。
SQL> select mod(-11,-4), remainder(-11,-4) from dual;
MOD(-11,-4) REMAINDER(-11,-4)
----------- -----------------
-3 1
SQL> select mod(11,-4), remainder(11,-4) from dual;
MOD(11,-4) REMAINDER(11,-4)
---------- ----------------
3 -1
精確的說,mod的函式取值為:n2-n1*floor(n2/n1)。所以,要注意在存在負數的時候,mod的問題。
remainder也有取餘的效果,那麼有什麼不同的?要點就在計算公式的floor上面。對remainder而言,Oracle沒有選擇floor,而是round四捨五入。
5、結論
Oracle提供了很多自定義函式,用好他們、用對他們,可以給予我們很大幫助。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30018455/viewspace-1447630/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 關於Oracle取整的函式Oracle函式
- Oracle常見數字函式Oracle函式
- Oracle取隨機數函式Oracle隨機函式
- Java中數字的四捨五入和取整Java
- Oracle OCP(03):字元函式、數字函式和日期函式Oracle字元函式
- PHP取整,四捨五入取整、向上取整、向下取整、小數擷取PHP
- 聊聊Oracle排序分析函式Oracle排序函式
- 聚合函式與數字函式函式
- 字元函式、數字函式和日期函式字元函式
- numtoyminterval函式——數字轉換函式函式
- php取整函式ceil,floor,round,intval函式的區別PHP函式
- MySQL 數字函式大全MySql函式
- 聊聊sort函式函式
- 取漢字全拼的SQL函式SQL函式
- ORACLE單行函式與多行函式之四:日期函式示例Oracle函式
- 【函式】Oracle函式系列(2)--數學函式及日期函式函式Oracle
- js裡函式呼叫的四種模式JS函式模式
- Oracle 獲取整數方式程式碼整理Oracle
- 如何使用python中的取整floor函式?Python函式
- java基礎之二:取整函式(Math類)Java函式
- 聊聊分散式快取分散式快取
- 數值得整數次方--模擬pow函式的功能函式
- ORACLE函式介紹第四篇 非著名函式之聚合函式Oracle函式
- 函式的關鍵字引數函式
- [MSSQL]SQL數字轉英文函式SQL函式
- SQL 數字轉換英文函式SQL函式
- 四、聊聊 pytest 的模組級、函式級、類級、方法級函式
- ORACLE單行函式與多行函式之三:數值函式Oracle函式
- Oracle 函式大全(字串函式,數學函式,日期函式,邏輯運算函式,其他函式)Oracle函式字串
- Python模組---向上向下取整、四捨五入取整Python
- python函式每日一講 - divmod數字處理函式Python函式
- Sql Server 裡的向上取整、向下取整、四捨五入取整的例項!SQLServer
- oracle 10g函式大全--數值型函式Oracle 10g函式
- Oracle-空值null和數字相加的問題-nvl函式OracleNull函式
- Python 函式 (關鍵字引數)Python函式
- 常用數字函式簡單舉例函式
- Scala:數字是物件,函式也是物件!物件函式
- 抽取字串中數字的函式字串函式