# Дробные числа
Числа бывают целыми и дробными. Для десятичных дробей, или чисел с плавающей запятой, в Python есть специальный тип данных — float (от англ. floating point, «плавающая точка»).
Дробные числа, как и целые, преобразуют к строкам вызовом функции str() :
Такой похожий код — и такой разный результат! Превратив числа в строки, мы получили один из IP-адресов серверов.
Можно и наоборот. Преобразуем строки в числа функцией float() :
Дробные числа приводят к целым функцией int() . Обратите внимание, что она не округляет числа по правилам арифметики, а лишь отбрасывает дробную часть.
Также можно сделать несколько преобразований в одной строчке. Попробуем сначала сделать дробь целым числом, а затем преобразовать ее в строку:
Что значит «плавающая запятая» и куда она плывет? Грубо говоря, дробные числа называются «числами с плавающей запятой», потому что запятая «плавает» по числу, когда его представляют в виде произведения значащей части и степени.
Например, число 3,14159 можно записать следующим образом:
В англоязычной литературе запятая называется точкой, floating point, потому что принято писать десятичные дроби через точку.
# Упражнения
Научим Виту вести беседы о погоде. Температура хранится в переменной temperature , а описание погоды — в переменной weather . Соберите из строк и переменных сообщение так, чтобы на экране вывелись все возможные четыре фразы:
Сегодня солнечно, температура воздуха -25 градусов Цельсия
Сегодня облачно, температура воздуха -25 градусов Цельсия
и т.д.
Очеловечим Виту. Пусть она округляет точные значения так, как это делают люди. Точное значение — дробь — хранится в переменной temperature_exact (англ. exact, «точный»). Выведите на экран строку вида За окном 39.3 градусов Цельсия. Это почти 40 Вита должна взять точное значение, отбросить знаки после запятой, добавить единицу и сообщить примерное значение, округлённое «вверх» — до ближайшего большего целого числа. Его Вита сохраняет в переменной temperature_approx(от англ. approximate, «примерный»). При другом значении temperature_exact должна изменяться и возвращаемая строка.
# Упражнения tkinter
Создайте оконное приложение "Вита", в которое выводятся данные о погоде: утро, день, вечер, ночь. Температура хранится в переменной temperature , а описание погоды — в переменной weather . Сегодня утром солнечно, температура воздуха -25 градусов Цельсия
Сегодня днем облачно, температура воздуха -25 градусов Цельсия
и т.д.
Создайте оконное приложение "Вита", в которое выводятся данные о температуре. Пусть она округляет точные значения так, как это делают люди. Точное значение — дробь — хранится в переменной temperature_exact (англ. exact, «точный»). Выведите на экран строку вида За окном 17.3 градусов Цельсия. Это почти 18 Вита должна взять точное значение, отбросить знаки после запятой, добавить единицу и сообщить примерное значение, округлённое «вверх» — до ближайшего большего целого числа. Его Вита сохраняет в переменной temperature_approx (от англ. approximate, «примерный»). При другом значении temperature_exact должна изменяться и возвращаемая строка.
Математические модули в Python: десятичные дроби и дроби
Даже самые простые математические операции могут иногда давать ошибочный результат. Это происходит из-за ограничений в сохранении точного значения некоторых чисел. Вы можете преодолеть эти ограничения, используя десятичный модуль в Python. Точно так же ни математика, ни модуль cmath, о которых мы узнали в нашем последнем уроке, не могут помочь нам в выполнении арифметики на основе дробей. Тем не менее, модуль фракций в Python делает именно это.
В этом руководстве вы узнаете как об этих модулях, так и о различных доступных им функциях.
Зачем нам десятичный модуль?
Вы, наверное, задаетесь вопросом, зачем нам нужен модуль для выполнения основной арифметики с десятичными числами, когда мы уже можем сделать то же самое с помощью чисел с плавающей точкой.
Прежде чем я отвечу на этот вопрос, я хочу, чтобы вы предположили выходное значение, если вы введете 0.1 + 0.2 в консоли Python. Если вы догадались, что выходное значение должно быть 0,3, вы будете удивлены, когда вы проверите фактический результат, который составляет 0,30000000000000004. Вы можете попробовать другой расчет, например, 0.05 + 0.1 и вы получите 0,15000000000000002.
Чтобы понять, что здесь происходит, попробуйте представить 1/3 в десятичной форме, и вы заметите, что число на самом деле не заканчивается в базе 10. Аналогично, некоторые числа, такие как 0,1 или 1/10, не заканчиваются в базе 2 Поскольку эти числа еще нужно как-то представить, при их сохранении делается несколько приближений, что приводит к этим ошибкам.
Число 0.30000000000000004 на самом деле очень близко к 0.3, поэтому большую часть времени мы можем избежать этого приближения. К сожалению, это приближение не приведет к сокращению, когда вы моделируете запуск спутника или имеете дело с деньгами. Другая проблема с этими приближениями состоит в том, что ошибки продолжают накапливаться.
Чтобы получить точные результаты, подобные тем, к которым мы привыкли при выполнении расчетов вручную, нам нужно что-то, что поддерживает быструю, правильно округленную, десятичную арифметику с плавающей запятой, и десятичный модуль делает именно это.
Использование десятичного модуля
Перед использованием модуля вам необходимо сначала его импортировать. После этого вы можете создавать десятичные числа из целых чисел, строк, чисел с плавающей точкой или кортежей. Когда десятичное число строится из целого числа или числа с плавающей запятой, происходит точное преобразование значения этого числа. Посмотрите на примеры ниже, чтобы понять, что я имею в виду:
fractions — Rational numbers¶
The fractions module provides support for rational number arithmetic.
A Fraction instance can be constructed from a pair of integers, from another rational number, or from a string.
class fractions. Fraction ( numerator = 0 , denominator = 1 ) ¶ class fractions. Fraction ( other_fraction ) class fractions. Fraction ( float ) class fractions. Fraction ( decimal ) class fractions. Fraction ( string )
The first version requires that numerator and denominator are instances of numbers.Rational and returns a new Fraction instance with value numerator/denominator . If denominator is 0 , it raises a ZeroDivisionError . The second version requires that other_fraction is an instance of numbers.Rational and returns a Fraction instance with the same value. The next two versions accept either a float or a decimal.Decimal instance, and return a Fraction instance with exactly the same value. Note that due to the usual issues with binary floating-point (see Floating Point Arithmetic: Issues and Limitations ), the argument to Fraction(1.1) is not exactly equal to 11/10, and so Fraction(1.1) does not return Fraction(11, 10) as one might expect. (But see the documentation for the limit_denominator() method below.) The last version of the constructor expects a string or unicode instance. The usual form for this instance is:
where the optional sign may be either ‘+’ or ‘-’ and numerator and denominator (if present) are strings of decimal digits (underscores may be used to delimit digits as with integral literals in code). In addition, any string that represents a finite value and is accepted by the float constructor is also accepted by the Fraction constructor. In either form the input string may also have leading and/or trailing whitespace. Here are some examples:
The Fraction class inherits from the abstract base class numbers.Rational , and implements all of the methods and operations from that class. Fraction instances are hashable , and should be treated as immutable. In addition, Fraction has the following properties and methods:
Changed in version 3.2: The Fraction constructor now accepts float and decimal.Decimal instances.
Changed in version 3.9: The math.gcd() function is now used to normalize the numerator and denominator. math.gcd() always return a int type. Previously, the GCD type depended on numerator and denominator.
Changed in version 3.11: Underscores are now permitted when creating a Fraction instance from a string, following PEP 515 rules.
Changed in version 3.11: Fraction implements __int__ now to satisfy typing.SupportsInt instance checks.
Numerator of the Fraction in lowest term.
Denominator of the Fraction in lowest term.
Return a tuple of two integers, whose ratio is equal to the Fraction and with a positive denominator.
New in version 3.8.
Alternative constructor which only accepts instances of float or numbers.Integral . Beware that Fraction.from_float(0.3) is not the same value as Fraction(3, 10) .
From Python 3.2 onwards, you can also construct a Fraction instance directly from a float .
Alternative constructor which only accepts instances of decimal.Decimal or numbers.Integral .
From Python 3.2 onwards, you can also construct a Fraction instance directly from a decimal.Decimal instance.
Finds and returns the closest Fraction to self that has denominator at most max_denominator. This method is useful for finding rational approximations to a given floating-point number:
or for recovering a rational number that’s represented as a float:
Returns the greatest int <= self . This method can also be accessed through the math.floor() function:
Returns the least int >= self . This method can also be accessed through the math.ceil() function.
__round__ ( ) ¶ __round__ ( ndigits )
The first version returns the nearest int to self , rounding half to even. The second version rounds self to the nearest multiple of Fraction(1, 10**ndigits) (logically, if ndigits is negative), again rounding half toward even. This method can also be accessed through the round() function.
Числа с плавающей точкой¶
Десятичные дроби в Python хранятся в формате с плавающей точкой и представлены типом float . Они могут быть записаны несколькими способами:
Конструкция float(x) принимает строку или целое число и возвращает число с плавающей точкой, т.е. объект типа float . Примеры:
Для вывода чисел с плавающей точкой, как и для вывода других объектов, может быть использована функция print :
Также существует способ указать количество выводимых знаков после запятой:
При преобразовании чисел с плавающей точкой в целые дробная часть отбрасывается, округления по арифметическим правилам не выполняется:
Для решения вычислительных задач может быть полезен модуль math из стандартной библиотеки языка Python. Для его использования нужно написать строку import math . Для решения задач нам понадобятся число \(\pi\) и функция извлечения квадратного корня. Примеры их использования:
Задачи¶
Дан диаметр окружности \(d\) . Найти ее длину по формуле \(length = \pi \cdot d\) .
Дано значение температуры \(t\_f\) в градусах Фаренгейта. Определить значение этой же температуры в градусах Цельсия. Температура по Цельсию \(t\_c\) и температура по Фаренгейту \(t\_f\) связаны следующим соотношением:
Найти значение функции \(y = 3x^6 — 6x^2 — 7\) при заданном значении \(x\) .
Даны два неотрицательных числа \(a\) и \(b\) . Найти их среднее геометрическое по формуле \(\sqrt\) .
Даны катеты прямоугольного треугольника \(a\) и \(b\) . Найти его гипотенузу \(c\) и периметр \(p\) :
Найти значение функции \(y = 4(x — 3) ^ 6 — 7(x-3) ^ 3 + 2\) при заданном значении \(x\) .
Дан радиус круга, найти его площадь по формуле \(s = \pi \cdot r ^ 2\) .
Дано значение температуры в градусах Цельсия. Вычислить значение этой же температуры в градусах Фаренгейта. Формулу вывести самостоятельно.
Дан объем данных в мегабайтах. Перевести его в гигабайты и килобайты. Результат вывести с точностю до двух знаков после запятой.