/**
 * 내역    : 부동 소수점 연산 오류 보정 및 반올림 정책 적용
 * 작성일 : 2007-03-22
 * 소유권 : commerceware
 *
 * 모든 연산의 반올림을 사용한다. default                                        
 * 최종 할인금액과 적립금을 계산하는 순간만 버림으로 사용                        
 *                                                                               
 * 고려대상                                                                      
 * 금액 할인의 금액 분배 ; 금액 할인 상품단위로 분배되는 경우              >> 반올림   
 * 상품 할인의 금액 분배 ; Set상품일 경우 구성상품으로 분배되는 경우  >> 반올림   
 * 부분반품, 부분취소 접수받을 때 ; 반품, 취소되어 분배되는 경우      >> 반올림   
 * 적립금 분배 ; Set상품일 경우 구성상품으로 분배되는 경우                 >> 반올림   
 *  
 * DEFAULT_FINAL_SIZE : 최종 소수점 유효 자리수
 * DEFAULT_MODE       : 기본 반올림 정책  [ 2:올림 3:버림 4:반올림 ]
 * VALID_DECIMAL      : 계산시 유효 소수점 자리수 
 * MODE_FLOOR         : 버림
 * MODE_ROUND         : 반올림 
 * MODE_CEIL          : 올림
 */ 
var DEFAULT_FINAL_SIZE = 2;
var DEFAULT_MODE       = 4;
var VALID_DECIMAL      = 6; 
var MODE_CEIL          = 2;
var MODE_FLOOR         = 3;
var MODE_ROUND         = 4;

/**
 * 부동 소수점 연산 오류 보정 을 위한 lpad 처리
 * @param newValue     : 입력 금액
 * @param len          : 금액 자리수 
 * @param ch           : 치환 문자
 * @return var
 * ex) modAmtlpad('345', 5, '0'); ==> 00345
 */
function modAmtlpad(newValue, len, ch){
    newValue   = newValue + "";
    var strlen = newValue.length;
    var ret    = "";
    var alen   = len - strlen;
    var astr   = "";
    for (var ilpadcnt=0; ilpadcnt<alen; ++ilpadcnt){
        astr = astr + ch;
    }    
    ret = astr + newValue;
    return ret;
}

/**
 * 부동 소수점 연산 오류 보정 및 반올림 정책 적용
 * @param argAmt       : 최종 금액
 * @param argMod       : 반올림 정책
 * @param argFinalSize : 최종 소수점 유효 자리수
 * @return double
 * ex) modAmt(12.345345,2, 2); ==> 12.35
 */
function modAmt(argAmt, argMod, argFinalSize){

    if(argMod       == null) argMod       = DEFAULT_MODE; 
    if(argFinalSize == null) argFinalSize = DEFAULT_FINAL_SIZE;   
    
    argAmt = Number(argAmt.toFixed(VALID_DECIMAL));
    
    if(argAmt == 0) return 0;
        
    if(argMod == MODE_ROUND){
        return Number(argAmt.toFixed(argFinalSize));    
    }

    var argData = String(argAmt).split('.');

    //= 만약 계산이 정확하면(integer)
    if(argData.length == 1){
        return argAmt;    
    //= 만약 계산이 정확하지 않으면
    }else{    

        //= 소수점 자리를 앞과 뒤로 분리   ( 12.3456 >> 12 & 345)
        var value1 = argData[0];
        var value2 = argData[1];
		
		//= 기준 자리수 보다 실제 값이  작은 경우 최종사이즈 변경
        if(value2.length < argFinalSize){
            argFinalSize = value2.length;     
        }

        //= 소수점 뒤자리를 최종 표시자리를 기준으로 소수점 처리 (34.56    if argFinalSize =2 )
        value2 = value2.substring(0,argFinalSize) + "." + value2.substring(argFinalSize, value2.length);

        //= 다시 문자열로 합침 ( 1234.56)
        value2 = value1 + value2;
        var tempdata = value2.split('.')[0];
        
        //= 버림, 반올림, 올림 처리함
        if(argMod == MODE_FLOOR){          
            value2 = Math.floor(value2);    //= ( 1234)
        }else if(argMod == MODE_ROUND){
            value2 = Math.round(value2);    //= ( 1235)
        }else if(argMod == MODE_CEIL){
            value2 = Math.ceil(value2);     //= ( 1235)
        }      

        //= 최종 표시자리에 일치하도록 소수점 자리를 옮김; 문자열 연산
        value2 = String(value2);
        if(tempdata.length != value2.length){
            value2 = modAmtlpad(value2,tempdata.length,'0');   
        }         
        value1 = value2.substring(0, value2.length - argFinalSize);
        value2 = value2.substring(value2.length - argFinalSize ,value2.length);

        //= 12  + . + 34(5) >> 12.34(5)
        return Number(value1 + "." + value2); 
    }
}