Python 3 浮点数/精度

新手上路,请多包涵

我正在读取一个带有浮点数的文本文件,所有浮点数都带有 1 或 2 个小数点。我正在使用 float() 将一行转换为浮点数,如果失败则引发 ValueError 。我将所有浮点数存储在一个列表中。打印出来时,我想将其打印为小数点后两位浮点数。

假设我有一个包含数字 -3.65, 9.17, 1 的文本文件。我阅读了每一个,一旦我将它们转换为浮动并将它们附加到列表中。现在在 Python 2 中,调用 float(-3.65) 返回 -3.65 。然而,在 Python 3 中, float(-3.65) 返回 -3.6499999999999999 失去了精度。

我想打印浮点数列表 [-3.6499999999999999, 9.1699999999999999, 1.0] 只有 2 个小数点。按照 '%.1f' % round(n, 1) 的方式做一些事情会返回一个字符串。我怎样才能返回浮点数的所有两个小数点的列表,而不是字符串?到目前为止,我使用 [round(num, 2) for num in list] 四舍五入,但需要设置小数点/精度而不是 round()

原文由 darksky 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 493
2 个回答

一句话,你不能。

3.65 不能完全表示为 float 。您得到的数字是最接近 3.65 的数字,它具有精确的 float 表示形式。

(较旧的?)Python 2 和 3 之间的区别纯粹是由于默认格式。

我在 Python 2.7.3 和 3.3.0 中都看到了以下内容:

 In [1]: 3.65
Out[1]: 3.65

In [2]: '%.20f' % 3.65
Out[2]: '3.64999999999999991118'

有关精确的十进制数据类型,请参阅 decimal.Decimal

原文由 NPE 发布,翻译遵循 CC BY-SA 3.0 许可协议

注释说明目标是 _打印到小数点后两位_。

Python 3 有一个简单的答案:

 >>> num=3.65
>>> "The number is {:.2f}".format(num)
'The number is 3.65'

或等效于 f-strings (Python 3.6+):

 >>> num = 3.65
>>> f"The number is {num:.2f}"
'The number is 3.65'

与往常一样,浮点值是一个近似值:

 >>> "{}".format(num)
'3.65'
>>> "{:.10f}".format(num)
'3.6500000000'
>>> "{:.20f}".format(num)
'3.64999999999999991118'

我认为大多数用例都希望使用浮点数,然后只 打印 到特定的精度。

那些希望将 数字本身 存储为精度为 2 位小数的用户,我建议使用 decimal 类型。对于那些感兴趣的人, 更多关于浮点精度的阅读

原文由 Andrew E 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题