2017-05-24 9 views
-3

여기에 무슨 일이 일어나고 있습니까? 변수를 소수로 만들 수없는 것 같습니까?변수를 십진수로 만들 수 없습니다.

from decimal import Decimal 

def calculate_lay_liability(stake, decimal_odds): 
    liability = (Decimal(decimal_odds) - 1) * Decimal(stake) 
    return liability 

stake = 5 
decimal_odds = Decimal(2.11) 

print(calculate_lay_liability(stake, decimal_odds)) 
print(Decimal(stake) * Decimal(decimal_odds)) 

내가 잘못 사용했을 수 있습니다! 내가 지분을 필요 * 내가 진수 객체를 사용하지 않을하지만 단지 플로트 사용이 목적을 위해 10.55

+3

이 코드는'5.549999999999999378275106210' 및 '10.54999999999999937827510621'을 출력합니다. 이는 나에게 십진수로 보입니다. – DeepSpace

+0

'Decimal' 객체가 많이 있습니다 ... –

답변

2

문제는 표현식이 Decimal(2.11)입니다. 2.11과 같은 수는 없습니다. 적어도 부동 소수점 수는 아닙니다. 여기에있는 매개 변수는 float로 정확하게 표현 될 수있는 가장 가까운 값은 실제로는 2.109999999999999875655와 같습니다. Decimal 클래스 다음에 은 정확하게을 나타냅니다. 정확한 Decimal을 원한다면 정확한 값으로 구성해야합니다 : Decimal("2.11")은 부동 소수점 형식을 거치지 않고 변환 자체를 수행하므로 부정확성이 없습니다.

0

동일하게 decimal_odds : 소수점에 대한 자세한 내용은

def calculate_lay_liability(stake, odds): 
    liability = (odds - 1) * stake 
    return liability 

stake = 5 
odds = 2.11 

print (calculate_lay_liability(stake, odds)) 
print stake * odds 

를 참조

https://docs.python.org/2/library/decimal.html 사용 a 10 진수 값을 생성하기 위해 입력으로 부동화하십시오. 정확하게 시작하지 않는 값을 제공하고 있습니다. 이 문제를 해결하는 방법은 문자열 값을 입력으로 제공하고이를 직접 Decimal로 변환하는 것입니다.

십진수 인스턴스는 정수, 문자열, 부동 소수점, 또는 튜플로 구성 할 수 있습니다. 정수 또는 실수로 구성하면 해당 정수 또는 부동 소수점 값을 정확히 변환합니다.

이것은 플로트를 제공 할 때 부동 소수점의 십진수 값과 정확히 정확하고 약간 부정확 한 값을 갖게됨을 의미합니다. 이미 입력으로 부동 소수점을 처리하는 경우 다음 quantisizing하여 값을 내림 할 수 있습니다 :

decimal_odds = Decimal(2.11).quantize(Decimal('1.00')) 
+0

자동으로 떠있는 것 같아요? 파이썬이 여기에 이진 계산을 사용하고 있다는 것을 알았습니다. 이것이 왜 잘못 나온 것입니까? – Davtho1983

+1

이것은 그의 질문에 대한 대답이 아니며, 플로트가 더 나은 선택인지 아닌지에 대한 제안입니다. – apesa

+0

대단하다. 그러나 이전에 Decimal을 사용해 보았던 것과 동일하다. 반올림하지 않고 정확히 5.55의 정확한 수치 답변에 도달 할 수있는 방법이 있습니까? – Davtho1983

0

decimal_odds = Decimal("2.11") 

을 시도 ... 이것은 정확한 값 진수 시작을 할 수 있습니다 float 근사 대신에. 마지막 결과는 Decimal('5.55')입니다.

반면에 float 값을 사용하는 것만으로 1.9 * 10 -14 %가됩니다. 지불금이 1 센트 씩 떨어지기 전에 내기는 문자 그대로 5 조 달러가되어야합니다.