Можете, пожалуйста, либо объяснить здесь, либо покидать ссылок. Я запутался в округлении в пайтоне. Можете показать как использовать метод format() именно для округления, не понимаю для чего нужны эти значки (пример: {8.3f}".format(12.2346)). Что лучше использовать для округления: какие модули, функции. И ещё об ошибках, которые могут возникать в питоне (пример: 0.1 + 0.1 + 0.1 = 0.30000000004). И почему эти ошибки возникают.
-
1В целом, не нужно задавать вопрос содержащий несколько вопросов. По поводу последнего см. Вычисления на числах с плавающей точкой не работают – insolor Aug 21 '21 at 11:42
-
1Возможный дубликат вопроса: Вычисления на числах с плавающей точкой не работают – Roman-Stop RU aggression in UA Aug 21 '21 at 13:03
-
@insolor спасибо за совет, учту на будующее! Но как быть если есть несколько вопросов, не уж то открывать несколько отдельных тем? – Даниил Красников Sep 05 '21 at 16:14
-
Здесь нет тем, есть вопросы. В каждом вопросе должен быть один отдельный вопрос. – insolor Sep 05 '21 at 17:55
2 Answers
Можете показать как использовать метод format() именно для округления, не понимаю для чего нужны эти значки (пример: {8.3f}".format(12.2346))
Строковый метод format() форматирует строки python для более красивого вывода.
Как работает format()?
Формат читает тип переданных аргументов и форматирует строку в соответствии с кодами форматирования в строке.
{8.3f} - это шаблон строки. Он содержит коды форматирования.
Прочесть вы можете здесь
Что лучше использовать для округления: какие модули, функции.
При выполнении ряда арифметических операций пользователю нужно следовать правилам округления. Преобразовывать нужно в большую или меньшую сторону, до целого значения или до сотых. В Python программисту для этого доступны функции round(), int() и модуль math. Последний дополнительно импортируется.
Про округление подробно здесь
И ещё об ошибках, которые могут возникать в питоне (пример: 0.1 + 0.1 + 0.1 = 0.30000000004). И почему эти ошибки возникают.
Числа с плавающей точкой представлены в компьютерах в виде двоичных дробей. К сожалению, большинство десятичных дробей не могут быть представлены точно как двоичные дроби. Следствием этого является то, что, как правило, вводимые десятичные числа с плавающей запятой аппроксимируются только двоичными числами с плавающей запятой, фактически сохраненными в машине.
Про ошибки в точности float здесь
- 2,150
- 1
- 4
- 13
Насчёт "значков". В скобках указывается формат числа, то это указание, сколько знаков до запятой и после запятой вы желаете увидеть у числа. Строятся они примерно вот так: {: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
(На работоспособность кода не претендую, чисто в показательных целях.)
- 147
-
Вот хороший ответ на похожий вопрос: https://ru.stackoverflow.com/a/417454/333652 – Sergey NaN Aug 21 '21 at 11:53