这里发生了什么?我似乎无法将变量变成小数?
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))
我可能使用了错误的东西!我需要赌注* decimal_odds等于10.55
答案 0 :(得分:2)
问题在于Decimal(2.11)
。没有这样的数字作为2.11 - 至少不是普通的浮点数,这是这里的参数:可以准确表示为浮点数的最接近的值实际上类似于2.109999999999999875655。 Decimal类然后完全表示不精确的值。如果你想要一个精确的十进制,你必须用一个确切的值来构造它:Decimal("2.11")
进行转换本身,而不用经过浮点格式,所以不会引入不准确。
答案 1 :(得分:0)
为此,我不会使用Decimal对象,只需使用float:
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
当使用float作为输入来构造Decimal值时,您提供的值不是一开始就不准确的。解决这个问题的方法是提供一个字符串值作为输入,并将其直接转换为十进制。
十进制实例可以用整数,字符串,浮点数构建, 或元组。从整数或浮点构造执行精确 转换该整数或浮点值。
这意味着当提供浮点数时,您将获得浮点数的精确,非常精确和稍微不准确的值作为小数值。如果您已经将浮点数作为输入处理,那么您可能希望通过量化来舍入值:
decimal_odds = Decimal(2.11).quantize(Decimal('1.00'))
答案 2 :(得分:0)
尝试
<script>
var clickTag = %%CLICK_URL_ESC%%%%DEST_URL%%?=utm_source=%%SITE%%-%ecid!
</script>
...这使得Decimal以精确值而不是浮点近似值开始。然后最终结果是decimal_odds = Decimal("2.11")
。
另一方面,仅仅使用浮动值仅仅是1.9 * 10 -14 % - 在支付被罚款一分之前,赌注必须是半个万亿美元。