本帖最后由 贪吃蛇 于 2014-2-13 21:14 编辑  
 
改用字符方式处理,防止数据溢出。 
用到的函数strsubEx(str,begin,end)在http://bbs.tyuyan.com/forum.php? ... 00&page=1#pid659451,函数rechar(str,char,pos=-1)在http://bbs.tyuyan.com/thread-38527-1-1.html调用函数的空间名有多个,使用时请注意。 
- function 四舍五入(num,x=0)    
 
 -     //参数:num,浮点型或字符串,要进行四舍五入的数;x,进行四舍五入的位置,>0就是从小数点向左数第x位,<0是向右数,=0是默认最右边. 返回值:字符串.
 
 -     //示例:四舍五入(129)返回值是"130",四舍五入(123.45)返回值是"123.5",四舍五入("1292.65",2)返回值是"1300",四舍五入(12.351,-2)返回值是"12.4"
 
 -     num=type.cstring(num)     //转字符型,兼容num为浮点型的情况.
 
 -     size=str.strleng(num)     //字符串长度    
 
 -     dot=str.findchar(num,46)  //小数点位置
 
 -     if(x==0)                  //默认参数处理
 
 -         if(dot==-1)
 
 -             x=1
 
 -         else
 
 -             x=(size-dot-1)*-1
 
 -         endif
 
 -     endif    
 
 -     if(dot==-1)               //没有小数点的情况
 
 -         dot=size
 
 -     endif
 
 -     if(x>0)//处理整数部分的四舍五入
 
 -         if(x>dot)
 
 -             traceprint("指定位置超出整数长度,返回null")
 
 -             return null
 
 -         endif 
 
 -         num=str.left(num,dot)//去掉小数        
 
 -         tmp=myStr.strsubEx(num,dot-x,dot-x+1)//得到判断位字符
 
 -         if(tmp<"5")//四舍
 
 -             for(i=dot-x;i<dot;i++)
 
 -                 num=myStr.rechar(num,"0",i)
 
 -             endfor
 
 -         else//五入
 
 -             for(i=dot-x;i<dot;i++)
 
 -                 num=myStr.rechar(num,"0",i)
 
 -             endfor
 
 -             num=myMath.进位(num,x+1)
 
 -         endif
 
 -         return num
 
 -     else//处理小数部分的四舍五入
 
 -         tmp=myStr.strsubEx(num,dot-x,dot-x+1)//得到判断位字符
 
 -         if(tmp<"5")//四舍
 
 -             num=str.left(num,dot-x)
 
 -         else//五入
 
 -             num=str.left(num,dot-x)
 
 -             num=myMath.进位(num)
 
 -         endif
 
 -         return num
 
 -     endif    
 
 - endfunction 
 
  
 
- function 进位(num,pos=1)
 
 -     //功能:在数值的指定位加1,返回进位后的值,仅支持正数.    
 
 -     //参数:num,字符串;pos,整型,首次进位的位置(1是最右边的数位);
 
 -     //示例:进位(123),返回124;进位(993,2),返回1003    
 
 -     num=type.cstring(num)
 
 -     size=str.strleng(num)
 
 -     if(pos>size+1 || pos<1)
 
 -         traceprint("进位参数pos越界,正确的取值范围是1≤pos≤num长度+1,返回原值的字符串")
 
 -         return num
 
 -     endif
 
 -     pos=size-pos //改pos位从左向右,从0计数
 
 -     for(i=pos;i>=-1;i--)
 
 -         tmp=str.strgetat(num,i)//得到进位的ASCII码  
 
 -         select(tmp)
 
 -             case -1:
 
 -             return "1"&num
 
 -             case 46://遇到小数点,i空走1次           
 
 -             case 57://9
 
 -             num=myStr.rechar(num,"0",i)            
 
 -             default:
 
 -             char=str.format("%c",tmp+1)
 
 -             return myStr.rechar(num,char,i)
 
 -         endselect
 
 -     endfor
 
 - endfunction
 
  复制代码 
 |