【问题标题】:Convert a list of string floats to a list of floats with 2 decimal points将字符串浮点数列表转换为具有 2 个小数点的浮点数列表
【发布时间】:2013-08-11 13:05:48
【问题描述】:

我进行了研究并进行了一些改进,非常接近解决此问题,但现在我陷入困境并需要帮助。

任务:将字符串浮点数列表转换为带 2 个小数点的浮点数

原名单:

mylist = ['17.21', '33.40', '24.39', '3.48', '1.02', '0.61', '18.03', '1.84']

目标

mylist = [17.21, 33.40, 24.39, 3.48, 1.02, 0.61, 18.03, 1.84]

我的脚本尝试

mylisttwo = map(float, mylist)

它给了我这个

[17.21, 33.4, 24.39, 3.48, 1.02, 0.60999999999999999, 18.03, 1.84]

然后我想到了id格式化

floatlist = []
for item in mylisttwo:
    floatlist.append("{0:.2f}".format(item))

但这又给了我一个字符串浮动列表!!啊啊啊

['17.21', '33.40', '24.39', '3.48', '1.02', '0.61', '18.03', '1.84']

我在这里做错了什么?

谢谢

【问题讨论】:

  • 如果您希望它们作为浮点数并打算用它们进行计算,我不会费心将它们四舍五入到小数点后 2 位,直到您需要显示它们。
  • 你为什么在乎? (严肃的问题。)0.60999999999999999 是否足以满足您的目的?如果没有,为什么不呢?

标签: python list floating-point decimal


【解决方案1】:

[round(float(i), 2) for i in mylist]

这应该可以。格式用于在其他字符串中插入字符串,如"Hello, {}! What is your favourite {}?".format("Jim", "colour")

如果你想让数字只存在2个小数位,你可以使用decimal模块。

【讨论】:

  • 由于浮点数在 python 中的表示方式,舍入不准确:docs.python.org/2/library/functions.html#round,但您的答案似乎比简单地说“它不可能”更相关,如此处所述类似的问题:stackoverflow.com/questions/14540143/…
  • 我知道我哪里出错了,谢谢。但在我使用的软件中,它给了我这个 [17.21, 33.4, 24.39, 3.48, 1.02, 0.60999999999999999, 18.03, 1.84]。由于某种原因,索引 5 未四舍五入到小数点后两位。
  • 查看上面的评论,计算机以二进制工作,所以就像以 10 为底,我们不能将 1/3 精确地表示为十进制 - 它是 0.33333333333... - 没有无限内存的计算机无法准确存储一些浮点数。
  • 使用 Decimal 模块怎么样?
  • round 在这里没有帮助:您的 round(float(i), 2) 不会改变任何事情。 float("0.61")已经返回最接近0.61的可表示浮点数,round 调用的结果将再次成为最接近0.61的可表示浮点数。
【解决方案2】:

您问了一个问题“我在这里做错了什么?”。 我认为,您做错了什么是作为参数传递给:

floatlist.append()

这个:

"{0:.2f}".format(item)

str 类的 Format 方法只是简单地返回格式化字符串,并且您期望得到固定的两位小数点浮点数。 Float 没有提供这样的选项。 user2387370 是对的,你应该使用十进制。

【讨论】:

    【解决方案3】:

    解决方法与numpy类似:

    import numpy as np
    
    np.round( [float(i) for i in mylist], 2)
    

    返回:

    array([ 17.21, 33.4 , 24.39, 3.48, 1.02, 0.61, 18.03, 1.84])

    【讨论】:

      【解决方案4】:

      我编写了以下代码,获取您的原始列表并将其映射到您的“目标”:

      from decimal import Decimal
      
      def str_to_float_with_precision(item):
          precision = 2
          return float(Decimal(item, precision))
      
      items = ['17.21', '33.40', '24.39', '3.48', '1.02', '0.61', '18.03', '1.84']
      floated_items = map(str_to_float_with_precision, items)
      print floated_items
      

      结果:

      [17.21, 33.4, 24.39, 3.48, 1.02, 0.61, 18.03, 1.84]
      

      【讨论】:

        猜你喜欢
        • 2018-07-07
        • 2018-12-19
        • 1970-01-01
        • 1970-01-01
        • 2017-09-26
        • 2012-05-04
        • 2019-10-31
        • 2019-03-31
        相关资源
        最近更新 更多