round()函数的文档声明您传递一个数字,并将小数点后的位置传递给round.因此它应该这样做:
n = 5.59 round(n, 1) # 5.6
但是,实际上,良好的旧浮点怪异爬进来,你会得到:
5.5999999999999996
出于UI的目的,我需要显示5.6
.我在互联网上搜索并发现一些文档,这取决于我的Python实现.不幸的是,这发生在我的Windows开发机器和我尝试过的每台Linux服务器上.在这里也看到.
没有创建我自己的圆形库,有什么方法可以解决这个问题吗?
格式化工作正常,即使不必舍入:
"%.1f" % n
我无法帮助它存储的方式,但至少格式化正常:
'%.1f' % round(n, 1) # Gives you '5.6'
如果使用Decimal模块,则可以在不使用"round"功能的情况下进行近似.以下是我用于舍入的内容,尤其是在编写货币申请时:
Decimal(str(16.2)).quantize(Decimal('.01'), rounding=ROUND_UP)
这将返回十进制数16.20.
round(5.59, 1)
工作正常.问题是5.6无法在二进制浮点中精确表示.
>>> 5.6 5.5999999999999996 >>>
正如Vinko所说,你可以使用字符串格式来进行舍入以进行显示.
如果需要,Python有一个用于十进制算术的模块.
如果你做的话,你会得到'5.6' str(round(n, 1))
而不是round(n, 1)
.
您可以将数据类型切换为整数:
>>> n = 5.59 >>> int(n * 10) / 10.0 5.5 >>> int(n * 10 + 0.5) 56
然后通过插入语言环境的小数分隔符来显示数字.
然而,吉米的答案更好.
浮点数学很容易受到轻微但令人讨厌的精确误差的影响.如果你可以使用整数或不动点,你将保证精度.
看看Decimal模块
Decimal"基于浮点模型,它是为人们设计的,并且必然具有最重要的指导原则 - 计算机必须提供与人们在学校学习的算法相同的算法." - 摘录自十进制算术规范.
和
十进制数字可以准确表示.相比之下,像1.1和2.2这样的数字在二进制浮点中没有精确的表示.最终用户通常不希望1.1 + 2.2显示为3.3000000000000003,就像二进制浮点一样.
Decimal提供了一种操作,使得编写需要浮点运算的应用程序变得容易,并且还需要以人类可读的格式(例如,会计)呈现这些结果.