在業(yè)務(wù)系統(tǒng)中處理小數(shù)精度,四舍五入,全舍棄,全進(jìn)位的方法

字號:

在業(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;