保留尾數與四舍五入的區别?應業務場景需求,需對結果值進一步處理,在此提供3種處理方式(Oracle),詳見附1,今天小編就來說說關于保留尾數與四舍五入的區别?下面更多詳細答案一起來看看吧!
應業務場景需求,需對結果值進一步處理,在此提供3種處理方式(Oracle),詳見附1。
01:四舍五入。ROUND就可以解決。round(數值,保留位數);
02:舍尾,也就是截位。REUNC函數。trunc(數值,保留位數);
03:進位。CEIL函數。FLOOR函數。這個稍微有點不一樣,需要區分正數進位,或者負數進位。
正數進位:CEIL(V_PRICE*POWER(10,V_LENGTH))/POWER(10,V_LENGTH);
負數進位:FLOOR(V_PRICE*POWER(10,V_LENGTH))/POWER(10,V_LENGTH);
還有一個小思路,感興趣的可以玩玩。
負數進位:CEIL(ABS(數值)*POWER(10,保留位數))/POWER(10,保留位數)*數值/-數值
--附1
CREATE OR REPLACE FUNCTION FUN_ROUNDING(I_PRICE IN NUMBER, --數值
I_ROUNDING IN VARCHAR2,--尾數處理方式,
I_LENGTH IN NUMBER) --保留位數
RETURN NUMBER IS
/******************************************************************************
NAME: FUN_ROUNDING
PURPOSE: 尾數處理( 01 四舍五入
02 舍尾
03 進位 )
參數說明:
******************************************************************************/
V_ROUNDING VARCHAR2(2) ;
V_PRICE NUMBER(22,8);
V_LENGTH NUMBER(22,8);
V_SQL NUMBER(22,8);
O_ROUNDING NUMBER(22,8);
BEGIN
V_PRICE := I_PRICE;
V_ROUNDING := I_ROUNDING;
V_LENGTH := I_LENGTH;
--(四舍五入 截位 進位)
IF V_ROUNDING = '02'
THEN V_SQL := TRUNC(V_PRICE,V_LENGTH);--截位
ELSIF v_rounding = '03'
THEN
IF V_PRICE > 0
THEN V_SQL := CEIL(V_PRICE*POWER(10,V_LENGTH))/POWER(10,V_LENGTH); --正數進位
ELSIF V_PRICE < 0
THEN V_SQL := FLOOR(V_PRICE*POWER(10,V_LENGTH))/POWER(10,V_LENGTH); --負數進位
--THEN V_SQL := CEIL(ABS(V_PRICE)*POWER(10,V_LENGTH))/POWER(10,V_LENGTH)*V_PRICE/-V_PRICE; --負數進位
END IF;
ELSE V_SQL := ROUND(V_PRICE,V_LENGTH); --四舍五入
END IF;
-- 返回值
SELECT V_SQL INTO O_ROUNDING FROM DUAL;
RETURN O_ROUNDING;
END;
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!