当前位置:  开发笔记 > 编程语言 > 正文

Python中的round()似乎没有正确舍入

如何解决《Python中的round()似乎没有正确舍入》经验,为你挑选了8个好方法。

round()函数的文档声明您传递一个数字,并将小数点后的位置传递给round.因此它应该这样做:

n = 5.59
round(n, 1) # 5.6

但是,实际上,良好的旧浮点怪异爬进来,你会得到:

5.5999999999999996

出于UI的目的,我需要显示5.6.我在互联网上搜索并发现一些文档,这取决于我的Python实现.不幸的是,这发生在我的Windows开发机器和我尝试过的每台Linux服务器上.在这里也看到.

没有创建我自己的圆形库,有什么方法可以解决这个问题吗?



1> Vinko Vrsalo..:

格式化工作正常,即使不必舍入:

"%.1f" % n


根据[docs](https://docs.python.org/3.2/tutorial/inputoutput.html#old-string-formatting),这种字符串格式最终会消失.新式格式为`"{:.1f}".format(n)`
圆不正确:`'%.5f'%0.988625`给出`0.98862`

2> Jimmy..:

我无法帮助它存储的方式,但至少格式化正常:

'%.1f' % round(n, 1) # Gives you '5.6'


我试过`print'%.2f'%655.665`但它返回'655.66`,应该是'655.67`
这是在搜索之后工作:)`从十进制导入十进制,ROUND_HALF_UP,ROUND_HALF_DOWN`#用于舍入浮点数`十进制(str(655.665)).量化(十进制('1.11'),四舍五入= ROUND_HALF_UP)`#问题和限制在浮点

3> 小智..:

如果使用Decimal模块,则可以在不使用"round"功能的情况下进行近似.以下是我用于舍入的内容,尤其是在编写货币申请时:

Decimal(str(16.2)).quantize(Decimal('.01'), rounding=ROUND_UP)

这将返回十进制数16.20.


**这是规范的答案** - 无论如何,准确性很重要,几乎无处不在.当然:_it有点冗长.但是把这个傻瓜扔进一个辅助函数,你就可以格式化了.

4> Will Harris..:

round(5.59, 1)工作正常.问题是5.6无法在二进制浮点中精确表示.

>>> 5.6
5.5999999999999996
>>> 

正如Vinko所说,你可以使用字符串格式来进行舍入以进行显示.

如果需要,Python有一个用于十进制算术的模块.



5> Tomi Kyöstil..:

如果你做的话,你会得到'5.6' str(round(n, 1))而不是round(n, 1).



6> Frank Kruege..:

您可以将数据类型切换为整数:

>>> n = 5.59
>>> int(n * 10) / 10.0
5.5
>>> int(n * 10 + 0.5)
56

然后通过插入语言环境的小数分隔符来显示数字.

然而,吉米的答案更好.



7> spoulson..:

浮点数学很容易受到轻微但令人讨厌的精确误差的影响.如果你可以使用整数或不动点,你将保证精度.



8> Jesse Dhillo..:

看看Decimal模块

Decimal"基于浮点模型,它是为人们设计的,并且必然具有最重要的指导原则 - 计算机必须提供与人们在学校学习的算法相同的算法." - 摘录自十进制算术规范.

十进制数字可以准确表示.相比之下,像1.1和2.2这样的数字在二进制浮点中没有精确的表示.最终用户通常不希望1.1 + 2.2显示为3.3000000000000003,就像二进制浮点一样.

Decimal提供了一种操作,使得编写需要浮点运算的应用程序变得容易,并且需要以人类可读的格式(例如,会计)呈现这些结果.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有