0

Можете, пожалуйста, либо объяснить здесь, либо покидать ссылок. Я запутался в округлении в пайтоне. Можете показать как использовать метод format() именно для округления, не понимаю для чего нужны эти значки (пример: {8.3f}".format(12.2346)). Что лучше использовать для округления: какие модули, функции. И ещё об ошибках, которые могут возникать в питоне (пример: 0.1 + 0.1 + 0.1 = 0.30000000004). И почему эти ошибки возникают.

2 Answers2

1

Можете показать как использовать метод format() именно для округления, не понимаю для чего нужны эти значки (пример: {8.3f}".format(12.2346))

Строковый метод format() форматирует строки python для более красивого вывода.

Как работает format()?

Формат читает тип переданных аргументов и форматирует строку в соответствии с кодами форматирования в строке.

{8.3f} - это шаблон строки. Он содержит коды форматирования.

Прочесть вы можете здесь

Что лучше использовать для округления: какие модули, функции.

При выполнении ряда арифметических операций пользователю нужно следовать правилам округления. Преобразовывать нужно в большую или меньшую сторону, до целого значения или до сотых. В Python программисту для этого доступны функции round(), int() и модуль math. Последний дополнительно импортируется.

Про округление подробно здесь

И ещё об ошибках, которые могут возникать в питоне (пример: 0.1 + 0.1 + 0.1 = 0.30000000004). И почему эти ошибки возникают.

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

Про ошибки в точности float здесь

Tehnorobot
  • 2,150
  • 1
  • 4
  • 13
1

Насчёт "значков". В скобках указывается формат числа, то это указание, сколько знаков до запятой и после запятой вы желаете увидеть у числа. Строятся они примерно вот так: {:x.yf}, где x - общее число знаков в числе, y - число знаков после запятой.

Примеры:

"{:2.3f}".format(12.545)  # Вывод: "12.545"
"{:2.5f}".format(12.545)  # Вывод: "12.54500"
"{:2.0f}".format(12.545)  # Вывод: "13"

Как видите, если знаков не хватает (2-ой случай), то число дополняется нулями. Если их слишком много (3-ий случай), число округляется. Насколько мне известно, используются стандартные математические правила, то есть (12.4 -> 12, 12.5 -> 13).

Теперь разберёмся с первым числом на примерах:

print("{:2.3f}".format(12.545))  # Вывод: "12.545"
print("{:10.3f}".format(12.545))  # Вывод: "    12.545" - перед числом 4 пробела
print("{:0.3f}".format(12.545))  # Вывод: "12.545"

Как видите, если число занимает меньше места, чем указано в первом параметре, то перед ним появятся пробелы, заполняющие место. Это удобно при построении таблиц.

Теперь насчёт "точности и ошибок вычисления". Данные ошибки происходят из-за способа представления чисел с плавающей точкой в памяти компьютера. Для этого используется стандарт IEEE754, лучше поискать про него что-то самостоятельно, но если в двух словах: при использовании ограниченного места на одно число приходится жертвовать точностью вычислений.

На практике же это означает, что вычисления с использованием таких чисел всегда происходят с погрешностью. Именно поэтому >>> 0.1 + 0.1 + 0.1 != 0.3. Чтобы сравнивать такие числа можно воспользоваться функцией сравнения разности чисел с заданной точностью. Вот пример:

def compareFloats(f1, f2, epsilon = 0.01):
    calculatedEpsilon = abs(f1 * epsilon)
    difference = abs(f1 - f2)
    return difference < calculatedEpsilon

a = 0.3 b = 0.1+0.1+0.1 print(a == b) # False print(compareFloats(a, b)) # True print(b) # 0.30000000000000004

(На работоспособность кода не претендую, чисто в показательных целях.)

  • Вот хороший ответ на похожий вопрос: https://ru.stackoverflow.com/a/417454/333652 – Sergey NaN Aug 21 '21 at 11:53