在Python中的round()似乎不是正确的四舍五入
round()函数的文档声明,您将它传递给一个数字,并且位置超过了小数点。 因此它应该这样做:
n = 5.59 round(n, 1) # 5.6
但是,实际上,古老的浮点奇怪会蔓延,你会得到:
5.5999999999999996
为了UI的目的,我需要显示5.6
。 我在互联网上search,发现一些文档依赖于我的Python实现。 不幸的是,这发生在我的Windows开发机器和我试过的每个Linux服务器上。 也看到这里 。
没有创build我自己的圆形图书馆,有没有办法解决这个问题?
不能帮助它存储的方式,但至less格式化工作正常:
'%.1f' % round(n, 1) # gives you '5.6'
格式化即使不必轮换也能正常工作:
"%.1f" % n
round(5.59, 1)
工作正常。 问题是5.6不能完全用二进制浮点表示。
>>> 5.6 5.5999999999999996 >>>
正如Vinko所说,你可以使用string格式来进行舍入显示。
Python有一个十进制算术模块,如果你需要的话。
如果使用十进制模块,则可以不使用“循环”function进行近似。 这是我一直用来四舍五入的,特别是在编写货币应用程序时:
Decimal(str(16.2)).quantize(Decimal('.01'), rounding=ROUND_UP)
这将返回一个hex数字16.20。
如果你用str(round(n, 1))
而不是用round(n, 1)
来得到'5.6'。
您可以将数据types切换为一个整数:
>>> n = 5.59 >>> int(n * 10) / 10.0 5.5 >>> int(n * 10 + 0.5) 56
然后通过插入语言环境的小数点分隔符来显示数字。
但是, 吉米的答案是更好的。
浮点math容易受到轻微的,但烦人的,精确的不准确性。 如果你可以使用整数或固定点,你将保证精度。
您可以使用string格式运算符%
,类似于sprintf。
mystring = "%.2f" % 5.5999
printf的吸盘。
print '%.1f' % 5.59 # returns 5.6
看看十进制模块
十进制“是基于一个浮点模型,该模型是以人为本的devise,并且必须有一个最重要的指导原则 – 计算机必须提供一个算术运算,就像人们在学校学习的算术一样。” – 摘自十进制算术规范。
和
十进制数可以精确地表示。 相比之下,像1.1和2.2这样的数字在二进制浮点上没有精确的表示。 最终用户通常不会期望1.1 + 2.2显示为3.3000000000000003,因为它使用二进制浮点。
十进制提供的操作types使得编写需要浮点操作的应用程序变得很容易,并且还需要以可读的格式(例如会计)呈现这些结果。
这确实是个大问题。 试试这个代码:
print "%.2f" % (round((2*4.4+3*5.6+3*4.4)/8,2),)
它显示4.85。 那你做:
print "Media = %.1f" % (round((2*4.4+3*5.6+3*4.4)/8,1),)
它显示了4.8。 你手工计算确切的答案是4.85,但如果你尝试:
print "Media = %.20f" % (round((2*4.4+3*5.6+3*4.4)/8,20),)
你可以看到这个事实:浮点被存储为分母是2的幂的分数的最近的有限和。
完美的作品
format(5.59, '.1f') # to display float(format(5.59, '.1f')) #to round
我在做:
int(round( x , 0))
在这种情况下,我们首先在单元级别进行适当的修改,然后转换为整数以避免打印浮点数。
所以
>>> int(round(5.59,0)) 6
我认为这个答案比格式化string更好,并且使我更加感觉使用循环函数。
关于什么:
round(n,1)+epsilon