无法将变量变为小数

时间:2017-05-24 15:07:28

标签: python variables decimal python-3.5

这里发生了什么?我似乎无法将变量变成小数?

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

3 个答案:

答案 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 % - 在支付被罚款一分之前,赌注必须是半个万亿美元。