как изменить 39.54484700000000 на 39.54 и использовать python [duplicate]

6

Возможный дубликат:
python ограничивает поплавки до двух десятичных знаков

Я хочу установить 39.54484700000000 в 39.54 с помощью python,

как его получить,

спасибо

  • 1
    Что вы подразумеваете под «изменением»? По твоему вопросу мы не можем угадать. Оба могут строки. Затем вы делаете фрагмент строки. Оба могут быть плавающими, так что вы усекаете. Первая может быть плавающей, а вторая строка и вы форматируете. Первый может быть строкой, а второй - плавающим, в этом случае вы конвертируете и округляете. На этот вопрос нельзя ответить в этой форме. Исправьте это, пожалуйста.
Теги:
floating-point

6 ответов

9
Лучший ответ

Если вы хотите изменить фактическое значение, используйте round как предложил Eli. Однако для многих значений и определенных версий Python это не будет представлено в виде строки "39.54". Если вы хотите просто округлить его, чтобы получить строку для отображения пользователю, вы можете сделать

>>> print "%.2f" % (39.54484700000000)
39.54

или в более новых версиях Python

>>> print("{:.2f}".format(39.54484700000000))
39.54

или с цепями

>>> print(f'{39.54484700000000:.2f}')
39.54

Соответствующая документация: операции форматирования строк, встроенные функции: round

  • 0
    но я не хочу получить строку '39 .54 ', я хочу получить number 39.54
  • 3
    Способ, которым обычное число хранится в Python, не может точно представлять значение 39,54 (потому что это значение base-10, которое не имеет конечного представления base-2). Вы можете использовать класс decimal.Decimal, предложенный другими, или обновить его до версии Python, которая преобразует неточное значение в нужную вам строку (CPython2.7 +, IIRC).
Показать ещё 1 комментарий
3

Вы можете использовать метод quantize, если вы используете десятичное значение:

In [24]: q = Decimal('0.00')

In [25]: d = Decimal("115.79341800000000")

In [26]: d.quantize(q)
Out[26]: Decimal("115.79")
2

Как насчет round

>>> import decimal
>>> d=decimal.Decimal("39.54484700000000")
>>> round(d,2)
39.54
2

Эли упоминает использование круглой функции - в зависимости от ваших требований, вы можете захотеть вместо этого вернуть десятичный объект.

>>> from decimal import Decimal
>>> float_val = 39.54484700000000
>>> decimal_val = Decimal("%.2f" % float_val)
>>> print decimal_val
39.54

Использование десятичных объектов позволяет указать точное количество знаков после запятой, которые вы хотите отслеживать, поэтому вы не сможете получить число с плавающей запятой, которое представлено как 39.539999999999999. В частности, если вы выполняете финансовые расчеты, вам почти всегда будет рекомендовано держаться подальше от чисел с плавающей запятой.

Вы не можете отличать float непосредственно в Decimals, однако (float неточно, и Python не может догадаться, как вы хотите, чтобы они округлились), поэтому я почти всегда сначала конвертирую их в округленное представление строки (что "%.2f" % float_val - %.2f означает отображение только двух десятичных знаков, а затем создание десятичного числа из этого.

  • 0
    это будет показ десятичного числа ("39.54"), но я не хочу получать Decimal
  • 1
    @ zjm1126: Вы пытались print это? print должна привести объект Decimal к строке, и его строковое представление будет просто "39.54"
1

Используйте round:

Возвращает значение с плавающей запятой x округленные до n цифр после десятичной точка. Если n опущено, оно по умолчанию нуль. Результатом является плавающая точка номер. Значения округлены до ближайшего кратное 10 на мощность минус n; если два кратных одинаково близки, округление от 0

>>> round(39.544847, 2)
39.539999999999999
>>> 

Обратите внимание, что поскольку 39.54 не является точно отображаемым с плавающими точками на моем ПК (x86), результат - это epsilon off. Но это не имеет значения (и это совершенно другая проблема со многими вопросами и ответами на него). Если вы правильно преобразуете его в строку, вы увидите, что вы ожидаете:

>>> "%.2f" % round(39.544847, 2)
'39.54'
  • 0
    но я хочу получить короткий номер, а не длинный номер.
  • 2
    @ zjm1126: в каком смысле? Вы хотите распечатать это? тогда просто используйте формат% .2f
1
>>> round(39.54484700000000, 2)
39.54

Обратите внимание, однако, что результат фактически не равен 39.54, но 39.53999999999999914734871708787977695465087890625.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню