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