应业务场景需求,需对结果值进一步处理,在此提供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;
,