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]
,只显示两位小数。如果我用 '%.1f' % round(n, 1)
的方式,得到的结果是字符串。我该如何返回一个所有浮点数都保留两位小数的列表,而不是字符串呢?到目前为止,我是用 [round(num, 2) for num in list]
来四舍五入,但我需要设置小数点的位数,而不是用 round()
。
5 个回答
简单的方法就是用内置的四舍五入功能。
round(2.6463636263,2)
这个代码会把数字显示成 2.65
。
评论中提到的目标是 打印出保留两位小数。
对于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 类型。对于感兴趣的人,可以阅读 关于浮点数精度的更多内容。
简单来说,你是无法做到的。
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
。