BUG 四舍五入 数据这么不准确么?

tom_533665 2022-5-20 689


Dim temp = ""
Dim iRet = ""
temp = 8735.365
iRet = Math.Round(temp,2)
TracePrint(iRet)
temp = 10257.435
iRet = Math.Round(temp,2)

TracePrint(iRet)

5.6.0  64 位


[14:25:03]流程块1.task 第6行:8735.37
[14:25:03]流程块1.task 第9行:10257.43


最新回复 (3)
  • 果子哩 2022-5-20
    2

    这边测试新版显示正常呢,建议用新版

  • tom9801 2022-5-20
    3
    果子哩 这边测试新版显示正常呢,建议用新版
    [2022-5-20 18:57:25] [INFO] 流程块.task 第6行:8735.36
    [2022-5-20 18:57:25] [INFO] 流程块.task 第10行:10257.44

    最新的版本也是有误 的,上面是运行结果。
  • 萝卜丝屁儿 2022-5-21
    4

    这题我会,看到这个问题我是震惊的,想不到6.0也没有解决这个问题。

    Python3中,round()不是我们理解的四舍五入函数,用round来处理浮点数可能会出现奇怪的结果。

    Python从2升到3的时候,很多人都反馈round函数变了,四舍五入函数round()变得不准。
    print(round(10257.435,2))
    结果是10257.43
    Python官方认为这不是bug,也不打算修复。
    简单来说,有些浮点数在计算机中并不能像整数那样被准确表达,它可能是近似值,因此就会出现这种问题。
    round()不是财务意义上的四舍五入函数,我把round()称为取有效数字的函数,要知道取有效数字有很多种方法,四舍五入只是其中一种,如何像Python2一样实现四舍五入呢?Python的建议是用decimal模块。
    回到UiBot,合理推测round()直接调用了Python的round(),所以继承了这个毛病,我看到有人调用Excel来做四舍五入,还有更优雅的办法比如写个插件调用Python的decimal函数,实现财务意义上的四舍五入。

    最简单的方法是在UB里面自己写个函数,最后我放弃了,UB Script连幂的运算都不支持。

    送上Python的插件吧。

    from decimal import Decimal
    def FinancialRound(strfloat,strpoints):
        points=int(strpoints)    
        if points==0:        
          precision="1."    
        else:        
          precision=str(round(0.1**points,points))
        result=Decimal(strfloat).quantize(Decimal(precision), rounding = "ROUND_HALF_UP") 
        return str(result)
        
     if __name__ == "__main__":
         print("Float=",10257.435)
         print("Round(10257.435,2)=",round(10257.435,2))
         print("RealRound(10257.435,2)=",FinancialRound("10257.435",2))    
         print("RealRound(10257.435,1)=",FinancialRound("10257.435",1))    
         print("RealRound(10257.535,0)=",FinancialRound("10257.535",0))    
         print("Float=",8735.365)    
         print("Round(8735.365,2)=",round(8735.365,2))    
         print("RealRound(8735.365,2)=",FinancialRound("8735.365",2)

    直接运行py结果如下:


    UB中调用方法:


    你可以看到浮点数被转换成字符来进行传递,只有这样,才能避免传递过程中出现精度问题。

    插件编写很简单的,把附件放到项目/extend/python下就可以了。

    不用谢,请叫我红领巾。

    我这么努力的回答,就是想感动官方能否给我一个金币让我把昵称改了。


    上传的附件:
返回
发新帖