Python 3 Float Decimal Points/Precision
Я читаю текстовый файл с номерами с плавающей запятой, все с 1 или 2 десятичными точками. Я использую float()
для преобразования строки в float и повышения ValueError
, если это не удается. Я сохраняю все поплавки в списке. Когда вы распечатываете его, я хотел бы распечатать его в виде плавающей запятой с двумя запятыми.
Предположим, у меня есть текстовый файл с цифрами -3,65, 9,17, 1. Я читаю каждый из них и однажды конвертирую их в float и добавляю их в список. Теперь в Python 2 вызов float(-3.65)
возвращает -3.65
. В Python 3, однако, float(-3.65) returns
-3.6499999999999999`, который теряет свою точность.
Я хочу напечатать список поплавков, [-3.6499999999999999, 9.1699999999999999, 1.0]
только с двумя десятичными запятыми. Выполнение чего-то в строках '%.1f' % round(n, 1)
вернет строку. Как я могу вернуть список всех двух десятичных точек поплавков, а не строк? До сих пор я округлял его с помощью [round(num, 2) for num in list]
, но вместо round()
нужно было установить десятичные точки/точность.
Ответы
Ответ 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
.
Ответ 2
Простой способ сделать это - использовать круглый buit-in.
round(2.6463636263,2)
будет отображаться как 2.65
.
Ответ 3
В комментариях указано, что целью является печать до двух знаков после запятой.
Там есть простой ответ для 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(f)
'3.65'
>>> "{:.10f}".format(f)
'3.6500000000'
>>> "{:.20f}".format(f)
'3.64999999999999991118'
Я думаю, что большинство случаев использования захотят работать с поплавками, а затем печатать только с определенной точностью.
Те, кто хочет, чтобы номера были сохранены точно в 2 десятичных разряда точности, я предлагаю использовать тип decimal. Подробнее о точности с плавающей запятой для тех, кто заинтересован.
Ответ 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
Надеюсь, это поможет вам!