本帖最后由 贪吃蛇 于 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
复制代码
|