TC官方合作论坛

 找回密码
 立即注册
查看: 2070|回复: 4

[功能] 四舍五入函数源码,可指定要进行四舍五入的位置

[复制链接]
发表于 2014-2-11 22:12:26 | 显示全部楼层 |阅读模式

马上加入TC

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
本帖最后由 贪吃蛇 于 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),并且代码简洁,但我这个支持指定位置,放出来给有需要的人。
新人第一次发代码,欢迎各位老师指正。

  1. function 四舍五入(num,x)
  2.     //参数:num,浮点型,要进行四舍五入的数;x,进行四舍五入的位置,>0就是从小数点向左数第x位,<0是向右数. 返回值:浮点型.
  3.     if(x==0)
  4.         traceprint("四舍五入参数错,位置不能为0,返回null")
  5.         return null
  6.     endif
  7.     num_size=str.strleng(type.cstring(num))
  8.     dot=str.findchar(type.cstring(num),46)
  9.     if(x>0)
  10.         if(x>dot)
  11.             traceprint("指定位置超出整数长度,返回null")
  12.             return null
  13.         endif
  14.         power=0.1
  15.         for(i=0;i<x;i++)
  16.             power*=10
  17.         endfor
  18.         num=type.int(num/power)
  19.         if(num%10>4)
  20.             return (type.int(num/10)+1)*10*power
  21.         else
  22.             return type.int(num/10)*10*power
  23.         endif
  24.     else
  25.         if(math.abs(x)>num_size-dot-1)
  26.             traceprint("指定位置超出小数长度,返回null")
  27.             return null
  28.         endif
  29.         power=1
  30.         var num_int=0
  31.         for(i=x;i<0;i++)
  32.             power*=10
  33.         endfor
  34.         num_int=type.int(num)//保留原数的整数部分
  35.         num=type.int((num-num_int)*power)//得到要处理的小数(已经转为整数)      
  36.         if(num%10>4)
  37.             num=(type.int(num/10)+1)*10
  38.             return num_int+num/power
  39.         else
  40.             num=type.int(num/10)*10
  41.             return num_int+num/power
  42.         endif        
  43.     endif   
  44. endfunction
复制代码

修改后的代码在5楼


评分

参与人数 1威望 +10 金币 +10 收起 理由
超自然 + 10 + 10 支持开源

查看全部评分

回复

使用道具 举报

发表于 2014-2-12 09:55:38 | 显示全部楼层
这个...建议楼主还是以字符串形式处理,防止x的值很大的时候会溢出
我有个返回1000位圆周率的方法,假设我要算第999位,会溢出不?如果不会,以后有大神提供1万位数据,需要算第9999位呢?
总有溢出的一天,字符串无此顾虑
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-12 12:20:16 | 显示全部楼层
超自然 发表于 2014-2-12 09:55
这个...建议楼主还是以字符串形式处理,防止x的值很大的时候会溢出
我有个返回1000位圆周率的方法,假设我要 ...

确实,超出数据范围会溢出,谢谢超自然
回复 支持 反对

使用道具 举报

发表于 2014-2-12 15:02:58 | 显示全部楼层
不错   支持一下  支持一下 -------------
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-13 21:04:36 | 显示全部楼层
本帖最后由 贪吃蛇 于 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调用函数的空间名有多个,使用时请注意。
  1. function 四舍五入(num,x=0)   
  2.     //参数:num,浮点型或字符串,要进行四舍五入的数;x,进行四舍五入的位置,>0就是从小数点向左数第x位,<0是向右数,=0是默认最右边. 返回值:字符串.
  3.     //示例:四舍五入(129)返回值是"130",四舍五入(123.45)返回值是"123.5",四舍五入("1292.65",2)返回值是"1300",四舍五入(12.351,-2)返回值是"12.4"
  4.     num=type.cstring(num)     //转字符型,兼容num为浮点型的情况.
  5.     size=str.strleng(num)     //字符串长度   
  6.     dot=str.findchar(num,46)  //小数点位置
  7.     if(x==0)                  //默认参数处理
  8.         if(dot==-1)
  9.             x=1
  10.         else
  11.             x=(size-dot-1)*-1
  12.         endif
  13.     endif   
  14.     if(dot==-1)               //没有小数点的情况
  15.         dot=size
  16.     endif
  17.     if(x>0)//处理整数部分的四舍五入
  18.         if(x>dot)
  19.             traceprint("指定位置超出整数长度,返回null")
  20.             return null
  21.         endif
  22.         num=str.left(num,dot)//去掉小数        
  23.         tmp=myStr.strsubEx(num,dot-x,dot-x+1)//得到判断位字符
  24.         if(tmp<"5")//四舍
  25.             for(i=dot-x;i<dot;i++)
  26.                 num=myStr.rechar(num,"0",i)
  27.             endfor
  28.         else//五入
  29.             for(i=dot-x;i<dot;i++)
  30.                 num=myStr.rechar(num,"0",i)
  31.             endfor
  32.             num=myMath.进位(num,x+1)
  33.         endif
  34.         return num
  35.     else//处理小数部分的四舍五入
  36.         tmp=myStr.strsubEx(num,dot-x,dot-x+1)//得到判断位字符
  37.         if(tmp<"5")//四舍
  38.             num=str.left(num,dot-x)
  39.         else//五入
  40.             num=str.left(num,dot-x)
  41.             num=myMath.进位(num)
  42.         endif
  43.         return num
  44.     endif   
  45. endfunction


  46. function 进位(num,pos=1)
  47.     //功能:在数值的指定位加1,返回进位后的值,仅支持正数.   
  48.     //参数:num,字符串;pos,整型,首次进位的位置(1是最右边的数位);
  49.     //示例:进位(123),返回124;进位(993,2),返回1003   
  50.     num=type.cstring(num)
  51.     size=str.strleng(num)
  52.     if(pos>size+1 || pos<1)
  53.         traceprint("进位参数pos越界,正确的取值范围是1≤pos≤num长度+1,返回原值的字符串")
  54.         return num
  55.     endif
  56.     pos=size-pos //改pos位从左向右,从0计数
  57.     for(i=pos;i>=-1;i--)
  58.         tmp=str.strgetat(num,i)//得到进位的ASCII码  
  59.         select(tmp)
  60.             case -1:
  61.             return "1"&num
  62.             case 46://遇到小数点,i空走1次           
  63.             case 57://9
  64.             num=myStr.rechar(num,"0",i)            
  65.             default:
  66.             char=str.format("%c",tmp+1)
  67.             return myStr.rechar(num,char,i)
  68.         endselect
  69.     endfor
  70. endfunction
复制代码

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条

关闭

小黑屋|TC官方合作论坛 (苏ICP备18045623号)

GMT+8, 2024-5-4 01:35 , Processed in 0.040269 second(s), 23 queries .

Powered by 海安简单软件服务部

© 2008-2019 版权所有 保留所有权利

快速回复 返回顶部 返回列表