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

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() нужно было установить десятичные точки/точность.

4b9b3361

Ответ 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

Надеюсь, это поможет вам!