tft每日頭條

 > 科技

 > 你真的了解oracle數據庫四種數字取整函數嗎

你真的了解oracle數據庫四種數字取整函數嗎

科技 更新时间:2025-01-15 12:59:54
概述

“四舍五入”是我們最早接觸的數學概念之一,數字取整也是我們最常接觸的一種需求樣式。在财務相關系統中,四舍五入的算法有時候對系統用戶造成巨大的影響。

在Oracle SQL中,提供了四種數字取整函數。從名稱上,他們都是在取整,但是具體算法有所不同。


1、環境介紹和準備

這裡選擇Oracle 11gR2版本進行測試。

SQL> select * from v$version;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)1

不同種類數據進行測試。

SQL> select * from t;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)2


2、四種基本取整函數

Oracle中的四種有取證功能函數為:ceil、floor、trunc和round,每一個都有不同的含義和特點,适合不同的場景。

2.1、ceil

Ceil的原始含義是說:返回比當前值大的第一個整數。這裡要注意“大”的概念,最簡單的理解就是我們數學上的數軸。Ceil就是返回當前值在數軸往右第一個整數值。

SQL> select id, ceil(id) from t;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)3

這裡主要注意負數的ceil結果,和我們直觀的想法有一些差異。而且ceil并沒有進行四舍五入。

2.2、floor

Floor與ceil相對應,應該說是正好相反。ceil取定數軸右側的第一個整數值。而Floor取定的是數軸左側的第一個整數值,也就是取小的動作。

SQL> select id, floor(id) from t;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)4

floor作用是找比當前值小的整數。

2.3、trunc

trunc是一個“多功能”函數。我們已經習慣其對date日期類型的處理方式。trunc輸入參數是日期類型時,起到的是裁斷天之後的時分秒信息。全部如期轉為00:00:00。但trunc面對數字類型輸入的時候,也會将小數點後面的數字截取。

SQL> select id, trunc(id) from t;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)5

trunc對數字也沒有“四舍五入”的概念,都是直接“截斷處理”。

2.4、round

嚴格的說,隻有round才算真正有“四舍五入”的選擇動作。

SQL> select id, round(id) from t;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)6

隻有round才有我們通常意義的四舍五入動作。


3、取整函數的精度scale取值

這些取整函數,一些可以帶一個可選參數,用來表示設置精度。當前我們數據為狀态如下:

SQL> select * from t;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)7

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;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)8

如果設置負數,就在小數點前面進行截取操作。


4、mod與remainder

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;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)9

當取餘操作的兩個參數都是整數的時候,我們基本看出什麼問題。但是一旦出現負數,無論是除數還是被除數,mod的行為和經典餘數模型有一些不同。

SQL> select mod(-11,-4), remainder(-11,-4) from dual; SQL> select mod(11,-4), remainder(11,-4) from dual;

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)10

精确的說,mod的函數取值為:n2-n1*floor(n2/n1)。所以,要注意在存在負數的時候,mod的問題。

remainder也有取餘的效果,那麼有什麼不同的?要點就在計算公式的floor上面。對remainder而言,Oracle沒有選擇floor,而是round四舍五入。


總結

Oracle提供了很多自定義函數,用好他們、用對他們,可以給予我們很大幫助。

後面會分享更多devops和DBA方面的内容,感興趣的朋友可以關注一下~

你真的了解oracle數據庫四種數字取整函數嗎(你真的了解Oracle數據庫四種數字取整函數嗎)11

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved