应业务场景需求,需对结果值进一步处理,在此提供3种处理方式(Oracle),详见附1,今天小编就来说说关于保留尾数与四舍五入的区别?下面更多详细答案一起来看看吧!

保留尾数与四舍五入的区别(尾数处理01)

保留尾数与四舍五入的区别

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

,