【问题标题】:Python 3 Float Decimal Points/PrecisionPython 3 浮点小数点/精度
【发布时间】:2013-01-10 11:58:57
【问题描述】:

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

假设我有一个带有数字 -3,65, 9,17, 1 的文本文件。我阅读了每个文件,并将它们转换为浮点数并将它们附加到列表中。现在在 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()

【问题讨论】:

  • 在 python 2 中,float(-3.65) 也是-3.6499999999999999。这是正常float 本质上不是 100 精确。
  • 不在我的:Python 2.7.2 (v2.7.2:8527427914a2, Jun 11 2011, 15:22:34) │ [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin │ Type "help", "copyright", "credits" or "license" for more information. │ >>> float(-3.65) │ -3.65
  • 另外,让我指出我知道float 并不准确,我知道这背后的原因。我正在寻找一个答案,它将显示如何在 Python 3 中以 2 个小数点打印出来。谢谢
  • 基本上,由于浮点的工作方式,您无法真正做到这一点。我建议你考虑在decimal 模块中使用Decimal 类。
  • 这只是 Python 将其四舍五入到小数点后最多 16 位的表示。

标签: python python-3.x floating-point


【解决方案1】:

一句话,你不能。

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

【讨论】:

  • 那么作为数字类型有没有办法限制小数位数呢?要打印 3.65,我需要将其打印为字符串?
  • @Darksky One 可以打印字符串。有时转换不是那么明确:但它总是完成。
  • 是的,那么我如何将3.64999999999999991118 表示为3.65 或任何2 个小数点,而不是字符串?我可以使用除 float 之外的任何其他类型吗?
  • decimal 模块中使用Decimal 而不是浮点数。
  • 我以为 Python 不久前就有了这个变化。更改float 格式,以便它尝试成为最短的字符串,可以转换回您正在打印的确切float。基本上,大部分时间都试图使这些类型的舍入问题消失。这种变化没有进入 Python3 吗?我以为我在 2.6 或 2.7 的更新日志中看到了它。
【解决方案2】:

执行此操作的简单方法是使用圆形内置。

round(2.6463636263,2) 将显示为2.65

【讨论】:

  • 虽然请注意documentation on round() 中的注释,即round() 在给定浮点值时会产生令人惊讶的结果。那里提到的例子:“round(2.675, 2) 给出了2.67 而不是预期的2.68。”
【解决方案3】:

cmets 声明目标是打印到小数点后两位

Python 3 有一个简单的答案:

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

或等效地使用 f 字符串(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类型。 More reading on floating point precision 给有兴趣的人。

【讨论】:

  • 没有看到 f-strings 的更新。老实说,我不确定我是否是粉丝,但很高兴知道!
  • 对于可能不了解该功能的其他用户来说,使用 f 字符串似乎不太易读。另一方面,使用 "{}".format() 在阅读时更加直观。
  • 感谢您。尝试阅读 docs.python.org/3/library/string.html#string-formatting 的文档,但在寻找答案时差点丧命并放弃了
【解决方案4】:

尝试使用python3通过下面这个函数来理解

def floating_decimals(f_val, dec):
    prc = "{:."+str(dec)+"f}" #first cast decimal as str
    print(prc) #str format output is {:.3f}
    return prc.format(f_val)


print(floating_decimals(50.54187236456456564, 3))

输出为:50.542

希望对您有所帮助!

【讨论】:

  • OP 不需要变量来定义精度 - 它设置在 2 个位置。但是对于可变精度,您不需要使用神秘的字符串加法prc = "{:."+str(dec)+"f}"。相反,嵌入精度:print("The number is {:.{}f}".format(f_val, dec))。相同但使用 f 字符串:print(f"The number is {f_val:.{dec}f}").
  • 这对我来说是一个完美的解决方案
【解决方案5】:

试试这个:

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

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

print(num)

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

或者,如果你想把它全部减少到 2 行:

num = float("%0.2f" % (float(input("Please input your number: "))))
print(num)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 2023-03-09
    • 1970-01-01
    • 2020-02-03
    相关资源
    最近更新 更多