#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?