2015-08-20 51 views
1

正如你们中许多人已经知道的那样,有时Python会将例如3.75 ....变成3.7而不是3.8,这当然是一个问题。 (我在Python 3上)。在Python中正确舍入浮点数的最简单方法是什么?

另一个用户在这里提出了一个非常好的Python函数,他称之为round_exact(可以通过搜索在Stack Overflow中找到这个函数),但不幸的是,即使这个函数对于我的目的,因为它似乎认为在过去的小数位零总是多余的,并将其削减。

(我的意思是,我想看看1.695到1.70,如果我想两位小数,而不是1.7)。

所以,我还是想问一下关于如何处理Python的附加意见在舍入花车时的缺点。

+4

在最后一个小数位* A零是*多余的。您正在寻找打印数字的方法,而不是打印数字。 – juanchopanza

+0

https://docs.python.org/2/library/functions.html#round - 对行为和链接进行简要说明。 (顺便说一下,这不是一个“Python问题”,而是一个与IEEE 754相关的问题,相对精度浮点运算用base2编码。) – user2864740

+2

*“有时候Python比如实现3.75 ....到3.7而不是3.8”* - 我只是测试它,它到达3.8。你到底在说什么? –

回答

3

十进制模块允许通过舍入的精确控制并且它可以保持尾随零:

>>> Decimal('1.695').quantize(Decimal('.01'), rounding=ROUND_HALF_UP) 
Decimal('1.70') 
+0

这似乎完美地工作。我不能够感谢你。不过,我注意到ROUND_UP对我来说不是正确的舍入选项。通过将其改为ROUND_HALF_UP似乎给了我期待的“到最近的圆,从零开始”的行为。 (另见:en.wikipedia.org/wiki/Rounding#Round_half_away_from_zero) – jaggedjava

1

对于数字显示,您应该打印两位小数而不是一位。这可以用专门的格式化打印语句来完成。

"{:.2f}".format(7.1) # prints 7.10 

如果您担心存在十进制不精确性,请查看decimal模块。它提供了高达28位的精确度,并可用于可靠地打印出这些数字。

+0

是的,这确实是十进制模块,解决了我的问题,谢谢你的提示。 – jaggedjava

相关问题