Программирование

Python: округление float до 2 знаков после запятой

Как правильно округлять float до 2 знаков в Python: решите проблему 13.949999999999999 с round(), f-строками и decimal. Python округление до 2 знаков без артефактов точности для финансов и измерений.

Как правильно округлять float до двух знаков после запятой в Python? У меня есть значение (13.949999999999999), которое я хочу округлить до 13.95, но когда я использую функцию round() с round(a, 2), она все равно возвращает 13.949999999999999 вместо ожидаемого 13.95.

Для правильного python округления до 2 знаков после запятой с float-числами вроде 13.949999999999999 используйте форматирование строк: f"{a:.2f}" или format(a, '.2f') — это вернёт строку “13.95”. Функция round(a, 2) на самом деле даёт 13.95, но проблема в отображении: Python хранит float в двоичном виде, и print(round(a, 2)) может показывать артефакты точности. Если нужна точность без потерь, берите модуль decimal — он решает округление float в Python идеально.


Содержание


Проблема точности float в Python

Представьте: вы пишете код, и вдруг 0.1 + 0.2 даёт не 0.3, а 0.30000000000000004. Звучит знакомо? Это классическая засада float в Python. Числа с плавающей запятой хранятся в двоичной системе, где 0.95 не представляется точно — отсюда ваш 13.949999999999999 вместо чистого 13.95.

Почему round(a, 2) не всегда выглядит идеально? На деле оно округляет правильно:

python
a = 13.949999999999999
print(round(a, 2)) # Вывод: 13.95
print(repr(round(a, 2))) # Может показать 13.949999999999999

Разница в print (str) и repr (полное представление). Но если вы выводите в файл или API, артефакты вылезут. Давай разберёмся, как округление после запятой python сделать надёжным. Без этого код для финансов или измерений превратится в головную боль.


Функция round() для python округления до 2 знаков

round() — встроенная функция для python округления до 2 знаков. Синтаксис простой: round(число, знаки). Для вашего случая:

python
a = 13.949999999999999
result = round(a, 2)
print(result) # 13.95

Работает по “банковским правилам”: 5 округляется к чётному (13.955 → 13.96). Но! Float-артефакты остаются. Хотите округление чисел в python вверх или вниз? Берите math.ceil() или math.floor():

python
import math
print(math.ceil(a * 100) / 100) # Округление в большую: 13.95
print(math.floor(a * 100) / 100) # В меньшую: 13.94

Плюсы: быстро, без импортов для базового случая. Минусы: не для точных расчётов. Когда python округление в большую сторону нужно строго, round подойдёт, но проверьте вывод.

А что если число уже “грязное”? Тестируйте всегда с repr() — увидите правду.


Форматирование строк для округления после запятой python

Самый простой хак для округления до 2 знаков после запятой python — f-строки или format(). Они возвращают строку, но с чистым видом:

python
a = 13.949999999999999
print(f"{a:.2f}") # 13.95
print("{:.2f}".format(a)) # 13.95
print(f"{round(a, 2):.2f}") # Тоже 13.95, но надёжнее

Почему это спасает? Форматирование “обрезает” float на лету, игнорируя артефакты. Идеально для логов, UI или JSON.

Ещё вариант — str.format() для старых Python:

python
print("%.2f" % a) # 13.95 (устаревший, но работает)

Хотите переменное количество знаков? f"{a:.{n}f}" где n=2. Быстро. Просто. И округление в f строках python решается за секунду. Но помните: результат — строка, конвертируйте в float только если нужно (float(f"{a:.2f}")).


Модуль decimal для точного округления чисел

Когда float подводит, зовите decimal — это как float, но с десятичной точностью. Для python float округление без сюрпризов:

python
from decimal import Decimal, ROUND_HALF_UP

a = Decimal('13.949999999999999') # Строка! Не float
result = a.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
print(result) # 13.95 точно

Ключ: передавайте строку в Decimal(), иначе float-ошибки уйдут с ним. Режимы округления:

  • ROUND_HALF_UP: классическое “вверх от 5”.
  • ROUND_HALF_EVEN: банковское.
  • ROUND_DOWN: в меньшую.

Пример для цепочки вычислений:

python
from decimal import Decimal
x = Decimal('0.1')
y = Decimal('0.2')
sum_xy = x + y # 0.3 точно!
print(sum_xy.quantize(Decimal('0.01'))) # 0.30

Официальная документация decimal рекомендует для денег и науки. Минус: медленнее float. Но для вашего 13.95 — идеал.


Другие методы python округления в большую или меньшую сторону

Не всё в round и decimal. Python округление вверх? math.ceil(a * 100) / 100. Вниз — math.floor. Numpy для массивов:

python
import numpy as np
arr = np.array([13.949999999999999, 2.555])
print(np.round(arr, 2)) # [13.95 2.56]

Для Pandas: df['col'].round(2). А если функция округления в большую сторону python без math? Самописный:

python
def ceil_to_2dec(x):
 return math.ceil(x * 100) / 100

Или numpy для скорости. Тестируйте на больших данных — float иногда выигрывает. Но для точности всегда decimal.

Что насчёт Python 2? Там round вёл себя иначе, теперь в 3.x стабильно. Проверьте версию: python --version.


Источники

  1. Документация Python: функция round
  2. Форматирование строк в Python
  3. Модуль decimal
  4. PEP 378: Python 3 round

Заключение

В итоге, для python округления до 2 знаков с float вроде вашего начинайте с f"{a:.2f}" — быстро и визуально чисто. Если точность критична, переходите на Decimal. Round хорош, но не панацея от float-артефактов. Протестируйте на реальных данных, и код перестанет бесить. Теперь 13.95 будет настоящим!

Авторы
Проверено модерацией
Модерация
Python: округление float до 2 знаков после запятой