【问题标题】:Summing up floats elements of array in python is adding garbage value to the end of the answer? [duplicate]在python中总结数组的浮动元素是在答案的末尾添加垃圾值吗? [复制]
【发布时间】:2020-03-19 07:25:20
【问题描述】:

我的代码是:

import array as arr

print("\t\t\tEnter Marks of the following subjects out of 100 :\n")

marks = arr.array('f') 


for x in range(5):
    marks.append(float(input("Enter marks of {0} subject : ".format(x+1))))

else:
    print("Calculating...")

sum = float(0.0)
for x in marks:
    sum += x

print("Total Marks (Out Of 500) = ",sum)

Code and Output

【问题讨论】:

  • 另外:您使用的是单精度浮点数(类型代码'f')。标准 python float 是双精度的,你应该将它用于基本上所有的事情(在 arr.array 中使用类型代码 'd'

标签: python arrays


【解决方案1】:

这是因为浮点数不是精确值。因此,当您添加它们时,您通常会以 ,00001 或 ,..999 结尾。解决此问题的一种方法是对最终结果进行四舍五入。例如:

print("Total Marks (Out Of 500) = ", round(sum,2))

你可以检查这个detailed article in Real Python ,它应该会有所帮助。

【讨论】:

    【解决方案2】:

    我不知道您是否需要使用array 库,但我看不到它的用处。你想用它来提高效率吗?如果是这种情况,请参阅 2 在 python 中,您可以将变量的值设置为空的list,因此您可以在代码中进一步使用它。例如:


    l = []
    for i in range(3):
        l.append(i)
    
    print(l)  # prints [0, 1, 2]
    

    所以在你的情况下你可以这样做:

    1)

    print("\t\t\tEnter Marks of the following subjects out of 100 :\n")
    
    marks = []
    for x in range(5):
        marks.append(float(input("Enter marks of {0} subject : ".format(x+1))))
    
    print("Calculating...")
    
    sum = 0
    for mark in marks:
        sum += x  # if x is a float in any of the loops then the sum will be a float.
    
    print("Total Marks (Out Of 500) = ", sum)
    

    或者如果您需要使用array 包:

    2)

    import array
    
    marks = array.array("f")
    for i in range(5):
        marks.append(float(input("Enter marks of {0} subject : ".format(i+1))))
    
    sum = 0
    for mark in marks:
        sum += mark
    
    print("Total Marks (Out Of 500) =", float(sum))  # prints the float value of the sum
    

    这似乎不需要那么高效,而且您可能不会通过使用array 库来更快地获取程序。使用timeit 模块查看哪个程序运行得更快。

    import timeit
    
    timeit.timeit(stmt="""import array
    
    in_marks = [80, 80.2, 80, 80, 80]
    marks = array.array("f")
    for i in range(5):
        marks.append(float(in_marks[i]))
    
    sum = 0
    for mark in marks:
        sum += mark
    
    # print("Total Marks (Out Of 500) =", float(sum))  # prints the float value of the sum""", number=1000000)
    
    # This took 1.7964587999999821 seconds to run 1.000.000 times
    # And 0.19057900000007066 to run 100.000 times
    

    这是没有图书馆的:

    import timeit
    
    timeit.timeit(stmt="""
    in_marks = [80, 80.2, 80, 80, 80]
    marks = []
    for i in range(5):
        marks.append(float(in_marks[i]))
    
    sum = 0
    for mark in marks:
        sum += mark
    
    # print("Total Marks (Out Of 500) =", float(sum))  # prints the float value of the sum""", number=100000)
    
    # This took 1.271052900000086 seconds to run 1.000.000 times
    # And 0.12818579999998292 seconds to run 100.000 times
    

    没有它,Python 似乎会更快,因为该程序不会进行任何繁重的计算,因此通过导入库您会浪费一些时间,并且从长远来看不会获得任何收益。


    要删除代码中的结尾数字,您可以 round() 浮点数到小数点后 2 位,就像 @Laurent Brisiel 建议的那样。

    【讨论】:

      猜你喜欢
      • 2018-01-27
      • 1970-01-01
      • 2015-04-17
      • 2021-11-13
      • 2017-03-14
      • 1970-01-01
      • 2013-07-15
      • 2010-12-30
      • 1970-01-01
      相关资源
      最近更新 更多