TC官方合作论坛
标题:
四舍五入函数源码,可指定要进行四舍五入的位置
[打印本页]
作者:
贪吃蛇
时间:
2014-2-11 22:12
标题:
四舍五入函数源码,可指定要进行四舍五入的位置
本帖最后由 贪吃蛇 于 2014-2-13 22:16 编辑
今天写代码需要用到四舍五入,TC的API没提供该功能,于是自己写了一个,后来发现论坛中
rainshine
已经提供了(
http://bbs.tyuyan.com/forum.php?mod=viewthread&tid=37848&highlight=%E5%9B%9B%E8%88%8D%E4%BA%94%E5%85%A5
),并且代码简洁,但我这个支持指定位置,放出来给有需要的人。
新人第一次发代码,欢迎各位老师指正。
function 四舍五入(num,x)
//参数:num,浮点型,要进行四舍五入的数;x,进行四舍五入的位置,>0就是从小数点向左数第x位,<0是向右数. 返回值:浮点型.
if(x==0)
traceprint("四舍五入参数错,位置不能为0,返回null")
return null
endif
num_size=str.strleng(type.cstring(num))
dot=str.findchar(type.cstring(num),46)
if(x>0)
if(x>dot)
traceprint("指定位置超出整数长度,返回null")
return null
endif
power=0.1
for(i=0;i<x;i++)
power*=10
endfor
num=type.int(num/power)
if(num%10>4)
return (type.int(num/10)+1)*10*power
else
return type.int(num/10)*10*power
endif
else
if(math.abs(x)>num_size-dot-1)
traceprint("指定位置超出小数长度,返回null")
return null
endif
power=1
var num_int=0
for(i=x;i<0;i++)
power*=10
endfor
num_int=type.int(num)//保留原数的整数部分
num=type.int((num-num_int)*power)//得到要处理的小数(已经转为整数)
if(num%10>4)
num=(type.int(num/10)+1)*10
return num_int+num/power
else
num=type.int(num/10)*10
return num_int+num/power
endif
endif
endfunction
复制代码
修改后的代码在5楼
作者:
超自然
时间:
2014-2-12 09:55
这个...建议楼主还是以字符串形式处理,防止x的值很大的时候会溢出
我有个返回1000位圆周率的方法,假设我要算第999位,会溢出不?如果不会,以后有大神提供1万位数据,需要算第9999位呢?
总有溢出的一天,字符串无此顾虑
作者:
贪吃蛇
时间:
2014-2-12 12:20
超自然 发表于 2014-2-12 09:55
这个...建议楼主还是以字符串形式处理,防止x的值很大的时候会溢出
我有个返回1000位圆周率的方法,假设我要 ...
确实,超出数据范围会溢出,谢谢超自然
作者:
今非
时间:
2014-2-12 15:02
不错 支持一下 支持一下 -------------
作者:
贪吃蛇
时间:
2014-2-13 21:04
本帖最后由 贪吃蛇 于 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
复制代码
欢迎光临 TC官方合作论坛 (http://bbs.52tc.co/)
Powered by Discuz! X3.1