这题我会,看到这个问题我是震惊的,想不到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下就可以了。
不用谢,请叫我红领巾。
我这么努力的回答,就是想感动官方能否给我一个金币让我把昵称改了。