Как округлить каждый элемент в списке поплавков до двух знаков после запятой?
У меня есть список, который состоит из значений 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]
Ответы
Ответ 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