在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