Подтвердить что ты не робот

Как округлить каждый элемент в списке поплавков до двух знаков после запятой?

У меня есть список, который состоит из значений float, но они слишком подробны для продолжения. Я знаю, что мы можем сократить их, используя оператор ("%.f" % variable), например:

result = [359.70000000000005]
result = "%.2f" % result
result = [359.70]

Мой вопрос в том, как я могу превратить список значений в их округленные эквиваленты без использования итератора. Я что-то пробовал, но он бросает TypeError:

list = [0.30000000000000004, 0.5, 0.20000000000000001]
list = "%.2f" % list
TypeError: not all arguments converted during string formatting

Как я могу предоставить чистый список, например:

list = [0.30, 0.5, 0.20]
4b9b3361

Ответ 1

"%.2f" не возвращает чистый float. Он возвращает строку, представляющую этот float с двумя десятичными знаками.

my_list = [0.30000000000000004, 0.5, 0.20000000000000001]
my_formatted_list = [ '%.2f' % elem for elem in my_list ]

возвращает:

['0.30', '0.50', '0.20']

Кроме того, не называйте свой list переменных. Это зарезервированное слово для создания списка. Используйте другое имя, например my_list.

Если вы хотите получить [0.30, 0.5, 0.20] (или, по крайней мере, поплавки, которые являются максимально возможными), вы можете попробовать следующее:

my_rounded_list = [ round(elem, 2) for elem in my_list ]

возвращает:

[0.29999999999999999, 0.5, 0.20000000000000001]

Ответ 2

Возможно, вы захотите посмотреть на модуль Python decimal, который может делать с использованием чисел с плавающей запятой и делать арифметику с ними намного более интуитивно понятным, Здесь тривиальный пример одного из способов его использования для "очистки" ваших значений списка:

>>> from decimal import *
>>> mylist = [0.30000000000000004, 0.5, 0.20000000000000001]
>>> getcontext().prec = 2
>>> ["%.2f" % e for e in mylist]
['0.30', '0.50', '0.20']
>>> [Decimal("%.2f" % e) for e in mylist]
[Decimal('0.30'), Decimal('0.50'), Decimal('0.20')]
>>> data = [float(Decimal("%.2f" % e)) for e in mylist]
>>> data
[0.3, 0.5, 0.2]

Ответ 3

Если вам действительно нужно решение без итератора, вы можете использовать функцию numpy и ее массивную круглую функцию.

import numpy as np
myList = list(np.around(np.array(myList),2))

Ответ 4

mylist = [0.30000000000000004, 0.5, 0.20000000000000001]
myRoundedList =  [round(x,2) for x in mylist] 
# [0.3, 0.5, 0.2]

Ответ 5

Другой вариант, который не требует numpy:

precision = 2  
myRoundedList = [int(elem*(10**precision)+delta)/(10.0**precision) for elem in myList]

# delta=0 for floor
# delta = 0.5 for round
# delta = 1 for ceil