Сегодня я начал использовать python, и мне интересно... Если я поставлю, print(10/3)
ответ будет ограничен
3.3333333333333335
потому что, очевидно, он не мог написать бесконечное число... Но есть ли способ изменить количество цифр, которые он пишет? Например, вместо того, чтобы писать 16 десятичных цифр, напишите 20, или 3, или 45 (чтобы я мог регулировать количество цифр, в заключение)
Проблема не столько в том, сколько знаков после запятой вы хотите отобразить число (которое вы можете контролировать,
"{:.10f}".format(10/3)
например, с помощью строк формата), сколько в том, с какой точностью оно фактически хранится.По умолчанию числа с плавающей запятой хранятся в формате IEEE-754, который использует 32 или 64 бита (в зависимости от одинарной или двойной точности) для хранения любого действительного числа. Python использует двойную точность. Естественно, в 64 битах, что является максимально возможной точностью, может быть представлено максимум 2^64 различных числа, что очень далеко от бесконечности порядка Алеф1, которым являются действительные числа. То есть существует бесконечное число чисел, не представимых в этом формате.
При работе с очень маленькими числами (типа 0,0000000...01) достигается очень высокая точность, так как числа, целая часть которых равна нулю, представляются в этом формате особым образом, достигая порядка 2^( − 1074 ), то есть исправить до десятичного числа 324, но по мере увеличения чисел точность падает, поскольку количество битов, доступных для представления цифр, постоянно, независимо от того, где стоит запятая.
Таким образом, для типов 1.00000...01 (которые больше не имеют нулевой целой части) он правильно сохраняется только приблизительно до десятичного числа 16, и по мере увеличения размера целой части количество точных десятичных знаков в дробной части уменьшается.
Результат 10/3 сохраняется правильно только до десятичных знаков 15 и после этого он уже неправильный, в чем можно убедиться, если попытаться отобразить его с 20 знаками после запятой:
Во многих научных областях точности, обеспечиваемой
float
типом Python (эквивалентной точностиdouble
C), достаточно, поскольку в науке также распространено, что при работе с небольшими числами требуется большая точность, и при работе можно допустить большую ошибку. с малыми числами большие, так что относительная ошибка постоянна.Однако, если вы хотите иметь полный контроль над точностью, вы должны прекратить использовать тип
float
и переключиться на использованиеDecimal
. Этот тип имеет произвольную точность, задаваемую программистом. К сожалению, он более громоздкий в эксплуатации. Посмотрите, например, как вычислить 10/3 с точностью до 30 правильных знаков после запятой:Хотя с помощью
format
вы можете уменьшить количество отображаемых знаков после запятой, если вы попытаетесь увеличить его выше 30, в этом случае будет обнаружена ошибка:Наконец, прокомментируйте, что у вас также есть тип дроби, который не пытается выполнить деление, а вместо этого хранит числитель и знаменатель отдельно, что позволяет избежать ошибок округления при работе с дробями (но они появятся снова при попытке преобразовать результат в
float
)Вы можете сделать следующее:
Вы объявляете переменную и внутри нее ставите деление:
Затем вы вызываете его и форматируете
В этой части вы говорите, что он должен занимать до 5 знаков после запятой {0:.5f}
Результат:
3.33333
Если вы измените на 2, результат будет следующим:
Если вы хотите распечатать данные с определенным количеством знаков после запятой, вы можете сделать следующее:
Результат
Обратите внимание, что значение не было изменено,
division_con_decimales
оно по-прежнему имеет десятичные разряды, которые были раньше. Если вы хотите округлить до определенных десятичных знаков, вы можете сделать:Результат
Наконец, вы можете проверить, что они не равны:
Результат
Элегантный и простой способ сделать это с помощью
math.trunc
И при его выполнении возвращает значение формы.
В чем фишка в том, что в
posiciones*numero
введенном вами числе число цифр смещается вправо, оноmath.trunc
исключает оставшиеся цифры справа и тогда при делении наposiciones
перемещаются те же цифры, которые ранее были сдвинуты вправо, но теперь налево.А именно.
Если вы ввели 5,55555 и хотите три цифры, сначала умножьте 5,55555*10^3, чтобы получить 5555,55.
math.trunc
вы получаете только 5555, а затем это делится на 10 ^ 3, так что теперь 5555/10 ^ 3 = 5555Я видел, что все используют,
.format()
но мне было любопытно, что никто не используетround()
Пример
формула
Этот код покажет вам результат деления с двумя десятичными знаками.