- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
-----------------水资源研究》第25卷 第2期(总第91期)2004年6月-----------------
巧用自定义函数解决水文资料中的“四舍六入”
张英骏
(河北省沧州水文水资源勘测局 河北 沧州 061000)
摘要: 以自定义函数的型式,给出了一个解决水文资料中“四舍六入,逢五奇进偶舍”计算机处理过程,具有简单性、通用性和易操作性,可直接用于水文行业上各类计算数据和资料整编结果的处理。并以流量计算、水质资料分析中部分特殊情况的处理为例,介绍了使用中应注意的问题和笔者的一点经验。
关键词: 水文资料 自定义函数 “四舍六入” 应用举例
工农业生产中每项实践活动都离不开数学理论的指导,对数字的处理上,涉及到小数位数、有效数字位数、取大(小)、取整、四舍五入、科学记数等在数学理论中都有透彻的研究。但在水文行业上,为提高资料精度,规范对大部分数字提出了“四舍六入,逢五奇进偶舍”的处理要求,同时还限制了相应的有效数字位数,以及对不同数值范围内的数据又有不同的规定。而计算机科学是数学的派生物,数学处理中没有明确这一模式,那么计算机也就不能直接处理这样要求的数据。虽然任何一个软件开发工具都没有提供这样的函数体,但都给开发人员提供了自定义函数的空间,这无疑是计算机的科学性、先进性的体现。笔者通过摸索,比较成功地定义了一个函数过程,既简单又实用,可以将它直接应用到处理全部水文数据上,它一经调入内存,使用方法和效率同系统函数没有任何区别。
1.函数过程设计思路
按照水文资料整编规范,对任一个数值X的处理都有2个约束参数:最多保留小数位数m和有效数字位数n,在尾数的取舍上遵从“四舍六入,逢五奇进偶舍”,按此可分三步来组织数据结构。
第一步:分析m和n的关系可以发现每个数值的不为0的整数位数同小数位数之和为该数的有效数字位数。只要|X|≥10m-n,处理后的小数位数就小于m,而有效数字位数满足为n位。于是可以运用压栈的方法对X每次前移一个小数点,直到|X|<10m-n。
第二步:按条件m实施舍入。不难看出它是“四舍五入”的一个特例,只有一种特殊情况“舍”,那就是数值X应保留部分末位为偶数,以后只有1位且恰好为“5”,主要工作就是判断唯一此种情况的发生,其他情况执行数学上的“四舍五入”(Round)即可满足要求。运用判断树详见图1。
●Truncate(舍)
○
●Round处理(入)
●Round处理(入)
●Round处理(舍或入)
图1 判断树
第三步:出栈恢复操作数X,返回函数值。
2.函数体源程序
函数过程脚本提供如下(这是一段PowerScript代码,各种编程代码大同小异,稍作改动即可):
// **“四舍六入,逢五奇进偶舍”自定义函数过程 **
// 函数形式 jjos(x,m,n) ,返回值ret_jjos为 Decimal 型
// x为操作数值, m为最多保留小数位数,n为有效数字位数
// m、n皆为 Integer 型
// m = 0 表示取整数,n = 0 表示对有效数字无要求
Integer i = 0
Decimal ret_jjos,j = 1
if x 0 then j = -1 //j用于记忆是正数还是负数
if n 0 then
Do while Abs(x) = 10^(n - m)
x = x/10 //向前移动一个小数点
i = i + 1
loop
end if
if Int(x * 10^(m + 1)) = x * 10^(m + 1) then
x = Round(x,m + 2)
ret_jjos = Dec(left(Right(String(x),3),1))
if Right(String(x),2) = 50 and Int(ret_jjos/2) = ret_jjos/2 then
ret_jjos = Truncate(x,m)*10^I //唯一此种情况舍
else
ret_jjos = Round(x,m)*10^I //不是那种情况执行四舍五入
end if
else
ret_jjos = Round(x,m)*10^I //其它情况执行四舍五入
end if
if n 0 then
if Int(ret_jjo
文档评论(0)