Числа с фиксированной точностью. Класс Decimal
Содержание
- 1. Особенности использования чисел с фиксированной точностью. Класс Decimal
- 2. Как с помощью класса Decimal задать нужную фиксированную точность? Примеры
- 3. Пример необходимости применения класса Decimal в программах на Python
- 4. Пример использования класса Decimal и функции str()
- 5. Использование фиксированной точности для чисел с разной точностью представлений. Пример
- 6. Создание объектов класса Decimal из вещественных чисел. Пример
- 7. Глобальная настройка точности. Пример
- Связанные темы
Поиск на других ресурсах:
1. Особенности использования чисел с фиксированной точностью. Класс Decimal
Числа с фиксированной точностью – это числа типа Decimal, которые при вычислениях используют фиксированное количество знаков после запятой. Тип Decimal – это специально разработанный класс (начиная с версии Python 2.4).
Понятие «фиксированная точность» означает, что с помощью таких чисел можно сохранять значение которое будет всегда иметь определенное количество знаков после запятой.
Например, нужно сохранять числа строго с числом 6 знаков после запятой.
Класс Decimal реализован в модуле decimal. Чтобы использовать возможности класса Decimal нужно выполнить команду
from decimal import Decimal
⇑
2. Как с помощью класса Decimal задать нужную фиксированную точность? Примеры
Чтобы создать объект класса Decimal используется конструктор этого класса. Конструктор получает строку с числом, в котором указывается заданная точность, например
Decimal('0.002') # фиксированная точность 3 знака после запятой Decimal('0.23') # фиксированная точность 2 знака после запятой Decimal('0.00001') # фиксированная точность 5 знаков после запятой
⇑
3. Пример необходимости применения класса Decimal в программах на Python
В примере продемонстрирована необходимость написания программ с использованием класса Decimal для случаев, когда точность вычисления крайне важна.
# Числа с фиксированной точностью. Класс Decimal - преимущества применения # подключить класс Decimal из модуля decimal from decimal import Decimal # обычное вычисление, существует погрешность a = 0.2+0.2+0.2-0.4 # a = 0.20000000000000007 - погрешность (???) print('a = ', a) # вычисление с помощью класса Decimal b = Decimal('0.2')+Decimal('0.2')+Decimal('0.2')-Decimal('0.4') print('b = ', b) # b = 0.2 - точный результат
Результат работы программы
a = 0.20000000000000007 b = 0.2
Сначала создается объект (переменная) с именем a, в которую записывается сумма
0.2+0.2+0.2–0.4
Затем значение этой переменной выводится на экран. Как видно из результата, результат вычисления переменной a содержит погрешность. Это связано с тем, что память, которая выделяется для чисел вещественного типа, ограничена. Другими словами, количество бит в представлении вещественных чисел есть недостаточным.
На следующем шаге создается объект с именем b, в который записывается сумма с использованием класса Decimal
b = Decimal('0.2')+Decimal('0.2')+Decimal('0.2')-Decimal('0.4')
После вывода значения b на экран, видно что значение переменной b представлено точно без погрешности.
⇑
4. Пример использования класса Decimal и функции str()
В предыдущем примере конструктор класса Decimal получал строку с числом
Decimal('0.2')
в котором определялась точность (1 знак после запятой) и значение числа 0.2.
Возможна ситуация, когда нужно передать непосредственно число а не строку. В этом случае удобно использовать функцию str(), как показано ниже
# вычисление с помощью класса Decimal b = Decimal(str(0.2))+Decimal(str(0.2))+Decimal(str(0.2))-Decimal(str(0.4)) print('b = ', b) # b = 0.2
Функция str() получает число и переводит его в строку
x = str(0.2) # x = '0.2'
⇑
5. Использование фиксированной точности для чисел с разной точностью представлений. Пример
Возможна ситуация, когда в выражении, содержащем класс Decimal, имеются числа с разной точностью представлений. В этом случае точность результата автоматически устанавливается равной точности числа с наибольшей точностью представления.
Например. При сложении трех чисел
c = Decimal('0.1')+Decimal('0.001')+Decimal(str(0.01)) # c = 0.111
автоматически устанавливается точность 3 знака после запятой, поскольку конструктор
Decimal('0.001')
определяет число 0.001 с наибольшей точностью представления.
⇑
6. Создание объектов класса Decimal из вещественных чисел. Пример
Для случаев, когда есть в наличии вещественное число, можно создать объект класса Decimal. В этом случае используется метод from_float() класса Decimal.
# Создание объекта типа Decimal, не всегда работает # Случай 1. Искаженная точность # x1 = 2.479999999999999982236431605997495353221893310546875 x1 = Decimal.from_float(2.48) print('x1 =',x1) # Случай 2. Фиксированная точность x2 = Decimal.from_float(2.5) # x2 = 2.5 - правильная точность print('x2 =', x2)
Результат выполнения вышеприведенного кода
x1 = 2.479999999999999982236431605997495353221893310546875 x2 = 2.5
Как видно из результата, не всегда удается получить фиксированную точность при использовании метода from_float().
⇑
7. Глобальная настройка точности. Пример
Бывают случаи, когда точность в программе нужно задать для всех операций текущего потока управления. Это может быть, например, представление денежных сумм с учетом копеек (2 знака после запятой).
Пример.
# Глобальное задание точности # подключить класс Decimal from decimal import Decimal a = Decimal(5)/Decimal(13) # точность не задана print('a = ', a) # a = 0.3846153846153846153846153846 # задание точности 6 знаков после запятой import decimal decimal.getcontext().prec=6 b = Decimal(5)/Decimal(13) print('b = ', b) # b = 0.384615 c = Decimal(6)/Decimal(13) print('c = ', c) # c = 0.461538
Результат выполнения программы
a = 0.3846153846153846153846153846 b = 0.384615 c = 0.461538
В вышеприведенном примере глобальная точность для класса Decimal задается с помощью функции getcontext(), которая возвращает объект контекста в этом модуле. Точность задается в текущем потоке управления.
⇑
Связанные темы
- Представление чисел разных форматов. Базовые числовые типы. Функции преобразования чисел
- Рациональные числа. Класс Fraction
⇑