swi*_*ams 114 python floating-point rounding
round()函数的文档声明您传递一个数字,并将小数点后的位置传递给round.因此它应该这样做:
n = 5.59
round(n, 1) # 5.6
Run Code Online (Sandbox Code Playgroud)
但是,实际上,良好的旧浮点怪异爬进来,你会得到:
5.5999999999999996
Run Code Online (Sandbox Code Playgroud)
出于UI的目的,我需要显示5.6.我在互联网上搜索并发现一些文档,这取决于我的Python实现.不幸的是,这发生在我的Windows开发机器和我尝试过的每台Linux服务器上.在这里也看到.
没有创建我自己的圆形库,有什么方法可以解决这个问题吗?
Vin*_*vic 100
格式化工作正常,即使不必舍入:
"%.1f" % n
Run Code Online (Sandbox Code Playgroud)
Jim*_*mmy 97
我无法帮助它存储的方式,但至少格式化正常:
'%.1f' % round(n, 1) # Gives you '5.6'
Run Code Online (Sandbox Code Playgroud)
小智 26
如果使用Decimal模块,则可以在不使用"round"功能的情况下进行近似.以下是我用于舍入的内容,尤其是在编写货币申请时:
Decimal(str(16.2)).quantize(Decimal('.01'), rounding=ROUND_UP)
Run Code Online (Sandbox Code Playgroud)
这将返回十进制数16.20.
Wil*_*ris 20
round(5.59, 1)工作正常.问题是5.6无法在二进制浮点中精确表示.
>>> 5.6
5.5999999999999996
>>>
Run Code Online (Sandbox Code Playgroud)
正如Vinko所说,你可以使用字符串格式来进行舍入以进行显示.
您可以将数据类型切换为整数:
>>> n = 5.59
>>> int(n * 10) / 10.0
5.5
>>> int(n * 10 + 0.5)
56
Run Code Online (Sandbox Code Playgroud)
然后通过插入语言环境的小数分隔符来显示数字.
然而,吉米的答案更好.
小智 5
确实是个大问题。试试这个代码:
print "%.2f" % (round((2*4.4+3*5.6+3*4.4)/8,2),)
Run Code Online (Sandbox Code Playgroud)
它显示 4.85。然后你做:
print "Media = %.1f" % (round((2*4.4+3*5.6+3*4.4)/8,1),)
Run Code Online (Sandbox Code Playgroud)
它显示 4.8。你手工计算的确切答案是 4.85,但如果你尝试:
print "Media = %.20f" % (round((2*4.4+3*5.6+3*4.4)/8,20),)
Run Code Online (Sandbox Code Playgroud)
您可以看到真相:浮点数存储为分母为 2 的幂的最接近的有限和。