Python 3 浮点数小数点/精度

58 投票
5 回答
212146 浏览
提问于 2025-04-17 13:46

我正在读取一个文本文件,里面有浮点数,都是带有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],只显示两位小数。如果我用 '%.1f' % round(n, 1) 的方式,得到的结果是字符串。我该如何返回一个所有浮点数都保留两位小数的列表,而不是字符串呢?到目前为止,我是用 [round(num, 2) for num in list] 来四舍五入,但我需要设置小数点的位数,而不是用 round()

5 个回答

59

简单的方法就是用内置的四舍五入功能。

round(2.6463636263,2) 这个代码会把数字显示成 2.65

86

评论中提到的目标是 打印出保留两位小数

对于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'

我觉得大多数情况下,大家会想先用浮点数进行计算,然后再 打印 出特定的小数位数。

如果你想要 数字本身 存储为精确的两位小数,我建议使用 decimal 类型。对于感兴趣的人,可以阅读 关于浮点数精度的更多内容

30

简单来说,你是无法做到的。

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

撰写回答