首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python -将浮点数舍入为2位数

Python -将浮点数舍入为2位数
EN

Stack Overflow用户
提问于 2014-07-08 22:38:31
回答 4查看 6.1K关注 0票数 3

我需要将一个浮点变量四舍五入为2位有效数字,并将结果存储到一个新的变量中(或者和以前一样,这并不重要),但是会发生这样的事情:

代码语言:javascript
复制
>>> a    
981.32000000000005    
>>> b= round(a,2)    
>>> b
981.32000000000005

我需要这个结果,但要放到一个不能是字符串的变量中,因为我需要将它作为一个浮点数插入...

代码语言:javascript
复制
>>> print b    
981.32

实际上,截断也可以,在这种情况下,我不需要极端的精度。

EN

回答 4

Stack Overflow用户

发布于 2014-07-08 22:45:39

你想要做的事情实际上是不可能的。这是因为981.32不能精确地表示为二进制浮点值。closest double precision binary floating point value为:

代码语言:javascript
复制
981.3200000000000500222085975110530853271484375

我怀疑这可能会让你感到震惊。如果是这样,那么我建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

您可以选择以下方法之一来解决您的问题:

  1. 承认二进制浮点数不能准确地表示这样的值,并继续使用它们。根本不做任何四舍五入,并保留完整的值。如果要将值显示为文本,请将其格式化为只发出两位小数。
  2. 使用能够准确表示数字的数据类型。这意味着十进制而不是二进制类型。在Python中,您将使用decimal.
票数 10
EN

Stack Overflow用户

发布于 2017-06-15 17:26:55

试试这个:

代码语言:javascript
复制
Round = lambda x, n: eval('"%.' + str(int(n)) + 'f" % ' + repr(x))

print Round(0.1, 2)
0.10
print Round(0.1, 4)
0.1000
print Round(981,32000000000005, 2)
981,32

只需指出您想要的位数作为第二个kwarg

票数 1
EN

Stack Overflow用户

发布于 2014-07-08 23:05:35

Python打印浮点数的方式和存储浮点数的方式是不同的。例如:

代码语言:javascript
复制
>>> a = 1.0/5.0
>>> a
0.20000000000000001
>>> print a
0.2

正如David Heffernan指出的那样,实际上不可能存储许多浮点数的精确表示。如果将浮点数看作一个分数,分母是2的幂(例如1/4,3/8,5/64),就可以这样做。否则,由于二进制的固有限制,它只能凑合使用近似值。

Python认识到了这一点,当您使用print函数时,它将使用上面看到的更好的表示。这可能会让您认为Python准确地存储了浮点数,而实际上并非如此,因为IEEE标准的浮点数表示法不可能做到这一点。但是,计算上的差异非常小,所以对于大多数实际目的来说,这不是一个问题。但是,如果您确实需要这些有效数字,请使用decimal包。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24634664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档