본문 바로가기

CGI (PHP, ... )

부동소수점 오류 개선 함수 (float) function float_math(string)

//###float function float_math(string)
function float_math(val)
{
  var math_flag = new Array();
  var make_val="";
  for(var i=0; i<val.length; i++)
  {
   var temp_str=val.charAt(i);
   if(temp_str.search(/[\-||\+||\*||\/]/g)!=-1)
   {
    math_flag.push(temp_str);
    make_val=make_val.concat("^");
   }
   else make_val=make_val.concat(temp_str);
  }
  var temp_arr=make_val.split("^");
  for(var i=0;i<math_flag.length;i++)
  {
   var input_val=new Array();
   if(!result) var result=temp_arr[i];
   input_val.push(result.toString());
   input_val.push(temp_arr[i+1].toString());
   result=float_math_query(input_val, math_flag[i]);
  }
  return parseFloat(result);
 }
 
 function float_math_query(val_arr, math_flag) 
 {
  var val_arr_length=val_arr.length;
  var point_length = new Array();
  var point_max_length=-1;
  for(var j=0; j<val_arr_length;j++)
  {
   var val=val_arr[j];
   var point_temp=-1;
   var point=false;
   for(var i=0; i<val.length; i++)
   {
    var temp=val.charAt(i);
    if(temp.search(/[\\.]/g)!=-1) point=true;
    if(point==true) point_temp++;
   }
   if(point_max_length < point_temp)  point_max_length=point_temp;
   val_arr[j]=val_arr[j].replace(/[\\.]/g,"");
   if(val.length>1) val_arr[j]=val_arr[j].replace(/^[0]/g,"");
   point_length.push(point_temp);
  }

  var in_zero="";
  for(var i=0;i<point_max_length;i++) in_zero=in_zero.concat("0");
  var return_zero=in_zero;

  var return_math;
  for(var i=0;i<val_arr_length;i++)
  {
   var temp_zero;
   if(point_length[i]!=-1) temp_zero=in_zero.substring(point_length[i]);
   else temp_zero=in_zero;

   if(i==0) return_math=parseInt(val_arr[i].concat(temp_zero));
   else
   {
     if(math_flag=="+") return_math=return_math+parseInt(val_arr[i].concat(temp_zero));
     else if(math_flag=="-") return_math=return_math-parseInt(val_arr[i].concat(temp_zero));
     else if(math_flag=="*")
     {
      return_math=return_math*parseInt(val_arr[i].concat(temp_zero));
      return_zero=return_zero.concat(in_zero);
     }
     else if(math_flag=="/")
     {
      return_math=return_math/parseInt(val_arr[i].concat(temp_zero));
      var flag="";
     }
   }
  }
  if(!flag) return_math=return_math/parseInt("1"+return_zero);
  return parseFloat(return_math);
 }