Python 3 Float十进制点/精度

dar*_*sky 34 python floating-point python-3.x

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

假设我有一个带有数字-3,65,9,17,1的文本文件.我读了每一个,然后我将它们转换为float并将它们附加到列表中.现在在Python 2中,调用float(-3.65)返回-3.65.然而,在Python 3中,float(-3.65) returns-3.6499999999999999`失去了它的精度.

我想打印浮点列表,[-3.6499999999999999, 9.1699999999999999, 1.0]只有2个小数点.沿着行做某事'%.1f' % round(n, 1)会返回一个字符串.如何返回浮点数的所有两个小数点的列表,而不是字符串?到目前为止,我使用它来舍入它,[round(num, 2) for num in list]但需要设置小数点/精度而不是round().

小智 37

执行此操作的简单方法是使用圆形buit-in.

round(2.6463636263,2)将显示为2.65.

  • 尽管请注意 [关于`round()` 的文档](https://docs.python.org/3/library/functions.html#round) 中的注释,即`round()` 可以给出令人惊讶的结果浮点值。那里提到的示例:“`round(2.675, 2)` 给出了 `2.67` 而不是预期的 `2.68`。” (2认同)

And*_*w E 37

注释表明目标是打印到2位小数.

Python 3有一个简单的答案:

>>> num=3.65
>>> "The number is {:.2f}".format(num)
'The number is 3.65'
Run Code Online (Sandbox Code Playgroud)

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

>>> num = 3.65
>>> f"The number is {num:.2f}"
'The number is 3.65'
Run Code Online (Sandbox Code Playgroud)

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

>>> "{}".format(num)
'3.65'
>>> "{:.10f}".format(num)
'3.6500000000'
>>> "{:.20f}".format(num)
'3.64999999999999991118'
Run Code Online (Sandbox Code Playgroud)

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

那些希望数字本身存储精确到2位十进制数字的人,我建议使用十进制类型.对于那些感兴趣的人,更多关于浮点精度的阅读.

  • 这是Py3的正确答案(也是最佳答案). (4认同)

NPE*_*NPE 25

总之,你做不到.

3.65不能完全表示为a 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'
Run Code Online (Sandbox Code Playgroud)

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

  • @Darksky One*只能*打印字符串.有时转换不是那么明确:但它始终是完成的. (2认同)
  • 在 `decimal` 模块中使用 `Decimal` 代替浮点数。 (2认同)

S.A*_*med 6

尝试这个:

num = input("Please input your number: ")

num = float("%0.2f" % (num))

print(num)
Run Code Online (Sandbox Code Playgroud)

我相信这要简单得多。对于1个小数位使用%0.1f。对于2个小数位,使用%0.2f等等。

或者,如果您要将其全部减少为2行:

num = float("%0.2f" % (float(input("Please input your number: "))))
print(num)
Run Code Online (Sandbox Code Playgroud)