Десятичный модуль в Python

#python #decimal

Вопрос:

Почему выводится этот код 25 , хотя я использовал десятичный модуль. Я попробовал это на калькуляторе, и он 26.28 выдал результат .

 from decimal import *
getcontext().prec = 2

targetPrice = 40
currentPrice = 56.5
winChance = 0.9
stopLoss = 23
lossChance = 0.1

expectancy =100 * abs(((Decimal(targetPrice) -  Decimal(currentPrice)) / Decimal( currentPrice))) *  Decimal(winChance)
print(expectancy)
 

Комментарии:

1. Вы выполняете все свои вычисления с точностью до 2. Это приводит к изрядному количеству ошибок округления. Ваш калькулятор использует более 15 знаков после запятой с точностью. Неудивительно, что это более точно. Десятичный модуль предназначен для вычислений с более высокой точностью, чем 64-разрядный с плавающей запятой. По какой-то причине вы используете его для расчетов с более низкой точностью.

2. Применение Decimal() к значениям с плавающей запятой полностью пропускает точку десятичного модуля. Например, значение 0,9 не может быть точно представлено в виде значения с плавающей запятой; преобразование его в десятичное значение приводит к точному значению, которое не совсем равно 0,9. Вы должны использовать строки, Decimal('0.9') например, для получения точных значений.

Ответ №1:

Вы получаете неточные результаты, потому что вы округляете их до двух знаков после запятой после каждого вычисления. Ваш калькулятор этого не делает.

Без округления.

 >>> (Decimal(40) - Decimal(56.5)) / Decimal(56.5)
Decimal('-0.2920353982300884955752212389')
 

С округлением:

 >>> (Decimal(40) - Decimal(56.5)) / Decimal(56.5)
Decimal('-0.28')
 

После этого становится только хуже.

Комментарии:

1. Должны ли мы использовать строки, как предложено в комментарии @jasonharper под OP?