程序中关于平均数的使用,我们有时候要非常谨慎,它并不是简单的相除操作!

        有一个项目准备要交付了,但我们在平均数中吃了一些亏,由此发个文章发泄发泄!大笑

        我们知道,在网页技术(asp/asp.net/jsp等)中,经常会碰到分页的情况;在采集系统中,也经常碰到分段采集的情况(也许这种情况往往通过协议来验证其完整性);在Windows桌面程序的一些分频处理中也涉及到平均数(像素)的考虑;在银行系统中更加严谨等等!......

       也许大家还不懂我在说什么,其实,我要说的是程序中的平均数使用过程中的“公式严谨性考虑”!举个栗子!

       我们要把程序界面(UI)在固定宽度像素的情况下,在同一个平行线上的每个平均点画点,我们应该怎么写程序呢?

         我们为了说明问题,举如下C#代码(假设Y坐标为100这条线上分13个部分,并在每个分割点中画点!):

         int  _formWidth=this.Width;//一个窗体的宽度!

         int  _pointCount=_formWidth/13//每一部分的宽度

         for(int i=0;i<14;i++)

         {

              //其它代码略!

              //其它画点方式相信大家有很多哦!

             g.DrawLine(new Pen(Color.Red),new Point(_formWidth/13*i,100),new Point(_formWidth/13*i,99));

          }

          看起来代码很简单,大家想一下,我们画的是平均点吗?

          告诉,大家的是,我们画图逻辑应没有太大的问题,但还是在每个点的定位上出了问题了:_formWidth/13*i这条语句出问题了

          按照数学的知识,好像没有问题,但是计算机中就问题大了,为了分析,我们要考虑各个运算符的含义及优先级:

          (1),/运算符:相除取整。

          (2),*相乘。(非C/C++的指针哦)

          (3),哪个在前哪个优先计算。(除了使用()等符号改变优先级之外!这些应该是基础吧微笑

           到这一步,我们就知道问题所在了!丢失精度了!为了改变精度,我们可以把_formWidth/13*i改成i*_formWidth/13,修改之后,我们大概在各个平均分割点上画上点了!(视觉方面,至少左右两边的点被画上了),但随着分母的变化,其精度又有所改变了,由此问题考虑起来就非常复杂了!

          为了把精度控制在1个像素左右(这个在视觉方面是完全可以接受的),我们可以这样处理!

         (int)(_formWidth*i*1.0/13)其相对精确了!即给其第一个允许乘以一个double类型数1.0,改变运算结果类型

          ....

          我们在很多场合中均会遇到类似的情况,即平均数或类平均数的情况,我们应该谨慎考虑其实际的精度性,然后再考虑其它的,否则有时候老牛也会吃亏的,偷笑

          好了,也不懂能否把问题说明白了,出错之处望指教了,睡觉去了!微笑

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值