在業(yè)務(wù)系統(tǒng)中,不同的客戶對小數(shù)的處理有不同的方法
通過在設(shè)置保留的小數(shù)位數(shù),以及小數(shù)位數(shù)以后的尾數(shù)的處理方法,可以靈活的滿足客戶要求
處理方法表
id number(1) , --設(shè)置id
amountdot number(4,2) default 0.01, --金額精確度 1: 精確到元 0.1:精確到角 0.01:精確到分rounding number(1) , --舍入分界 -- 9: 全舍 0: 全入 4:四舍5入
建立oracle函數(shù),傳入設(shè)置id,傳入金額,返回處理過的金額
存儲過程實(shí)現(xiàn)代碼如下
create or replace function get_real_number ( --根據(jù)處理方法id,取得處理后的金額-計(jì)算的金額
id in number, -- 處理方法id
n_amount in number)
-----------------------------------------------------------------------
-- 用 途 自定義數(shù)據(jù)精度處理。
-- 創(chuàng)建者 :andrew
-----------------------------------------------------------------------
-- 修改記錄列表:(按日期的先后順序逆序排列)
-- 修改時間 修改人 實(shí)現(xiàn)的功能說明
-- 9 全舍 0 全入 4四舍5入
-----------------------------------------------------------------------
return number-- 返回的金額
is
v_amountdot varchar2(5); --小數(shù)位數(shù)字符
v_keep number ; --保留的小數(shù)位數(shù)
v_rounding number ; --舍入分界
v_amount number:=0 ; --返回的金額
begin
select amountdot, nvl(rounding,0) into v_amountdot,v_rounding from 處理方法表
where id = sale_place_id;
v_keep := length(v_amountdot) - instr(v_amountdot,'.') ; --要保留的小數(shù)位數(shù)
if v_rounding = 9 then --處理全舍棄
v_amount := trunc(n_amount,v_keep);
end if;
if v_rounding = 4 then --處理四舍五入
v_amount := round(n_amount,v_keep);
end if;
if v_rounding = 0 then --處理全進(jìn)位
v_amount := trunc(n_amount,v_keep); --小數(shù)為數(shù)剛好等于要求保留的數(shù)
if v_amount <> n_amount then --如果截取后的數(shù)與原來的數(shù)字不同,進(jìn)1
v_amount := v_amount + to_number(v_amountdot);
end if;
return v_amount;
exception
when others then return n_amount;
end get_real_number;
通過在設(shè)置保留的小數(shù)位數(shù),以及小數(shù)位數(shù)以后的尾數(shù)的處理方法,可以靈活的滿足客戶要求
處理方法表
id number(1) , --設(shè)置id
amountdot number(4,2) default 0.01, --金額精確度 1: 精確到元 0.1:精確到角 0.01:精確到分rounding number(1) , --舍入分界 -- 9: 全舍 0: 全入 4:四舍5入
建立oracle函數(shù),傳入設(shè)置id,傳入金額,返回處理過的金額
存儲過程實(shí)現(xiàn)代碼如下
create or replace function get_real_number ( --根據(jù)處理方法id,取得處理后的金額-計(jì)算的金額
id in number, -- 處理方法id
n_amount in number)
-----------------------------------------------------------------------
-- 用 途 自定義數(shù)據(jù)精度處理。
-- 創(chuàng)建者 :andrew
-----------------------------------------------------------------------
-- 修改記錄列表:(按日期的先后順序逆序排列)
-- 修改時間 修改人 實(shí)現(xiàn)的功能說明
-- 9 全舍 0 全入 4四舍5入
-----------------------------------------------------------------------
return number-- 返回的金額
is
v_amountdot varchar2(5); --小數(shù)位數(shù)字符
v_keep number ; --保留的小數(shù)位數(shù)
v_rounding number ; --舍入分界
v_amount number:=0 ; --返回的金額
begin
select amountdot, nvl(rounding,0) into v_amountdot,v_rounding from 處理方法表
where id = sale_place_id;
v_keep := length(v_amountdot) - instr(v_amountdot,'.') ; --要保留的小數(shù)位數(shù)
if v_rounding = 9 then --處理全舍棄
v_amount := trunc(n_amount,v_keep);
end if;
if v_rounding = 4 then --處理四舍五入
v_amount := round(n_amount,v_keep);
end if;
if v_rounding = 0 then --處理全進(jìn)位
v_amount := trunc(n_amount,v_keep); --小數(shù)為數(shù)剛好等于要求保留的數(shù)
if v_amount <> n_amount then --如果截取后的數(shù)與原來的數(shù)字不同,進(jìn)1
v_amount := v_amount + to_number(v_amountdot);
end if;
return v_amount;
exception
when others then return n_amount;
end get_real_number;