以文本方式查看主题

-  Foxtable(狐表)  (http://www.foxtable.com/bbs/index.asp)
--  专家坐堂  (http://www.foxtable.com/bbs/list.asp?boardid=2)
----  四舍五入遇到的怪现象,是不是偶然的?  (http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&id=61642)

--  作者:zhangchi96
--  发布时间:2014/12/16 14:57:00
--  四舍五入遇到的怪现象,是不是偶然的?

在窗体中添加了按钮控件,代码:

 

 

Dim 失保比例 As Double

    失保比例 = 0.005

Dim 小数位数 As Double

    小数位数 = 2

With  DataTables("教职工信息表")

    Dim 岗位工资 As Double

    Dim 薪级工资 As Double

    For Each dr As DataRow In DataTables("教职工信息表").DataRows

         岗位工资 = dr("岗位工资_标准")

         薪级工资 = dr("薪级工资_标准")

         dr("缴失保") = round2( 失保比例 * math.Max(2299,岗位工资+薪级工资+dr("教龄津贴")+dr("岗位津贴")) ,小数位数)

    Next

End With

 

当其中的   岗位工资+薪级工资+dr("教龄津贴")+dr("岗位津贴")  计算结果是3437时,3437*0.005=17.185,近似值为17.19,但显示结果却为17.18

 

实验时发现,计算结果为下列数时,取得的近似值如下

   3457*0.005=17.285 ,显示17.29

   3477*0.005=17.385 ,显示17.39

   3497*0.005=17.485 ,显示17.49

唯一错误的是:

    3437*0.005=17.185 ,显示17.18

后来我把公式

       dr("缴失保") = round2( 失保比例 * math.Max(2299,岗位工资+薪级工资+dr("教龄津贴")+dr("岗位津贴")) ,小数位数)

 

直接改成:

       dr("缴失保") = round2( 17.185 ,2) ,结果还是返回17.18

 

    请指教一下,这是什么原因呢,怎么也想不明白?


--  作者:有点甜
--  发布时间:2014/12/16 15:00:00
--  

 不要用Round2,直接用Format

 

Format(17.185, "#.00")


--  作者:狐狸爸爸
--  发布时间:2014/12/16 15:24:00
--  

楼主是老版本把?

我测试:

round2( 17.185 ,2)

得到的是17.19


--  作者:zhangchi96
--  发布时间:2014/12/17 8:15:00
--  

嗯,是的,用2014-10-22的版本就没这个问题了,老版本怎么就出这个问题了呢?


--  作者:有点甜
--  发布时间:2014/12/17 9:09:00
--  
以下是引用zhangchi96在2014-12-17 8:15:00的发言:

嗯,是的,用2014-10-22的版本就没这个问题了,老版本怎么就出这个问题了呢?

 

bug


--  作者:程兴刚
--  发布时间:2014/12/17 9:14:00
--  
楼主,其实您这个才更符合国际惯例,“4舍6入5看单”,当舍取位为5时,则看前一位,单入双舍,这样的取舍才能使整个帐面比我国习惯的4舍5入更平衡!
--  作者:zhangchi96
--  发布时间:2014/12/17 12:52:00
--  

      是的,从概率来说,0.5算作1的概率是50%更科学,“4舍6入5看单”如果引用到小学课本的话可能难了点,大多人的思维定势不喜欢这样的。

      不过round2和round不一样啊,round2(17.285,2)=17.28,这个BUG也太蹊跷了,除了17.285,测试过还有这个问题的其他数字吗?我的这个数字算不算一个重要的发现呢!

[此贴子已经被作者于2014-12-17 12:52:33编辑过]

--  作者:有点甜
--  发布时间:2014/12/17 14:18:00
--  

round2原先有bug的,新版已经修正。

 

用format可以正常。