【问题标题】:Can't make variables into decimals [closed]不能将变量变成小数[关闭]
【发布时间】:2017-10-25 00:41:27
【问题描述】:

这里发生了什么?我好像不能把变量变成小数?

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

【问题讨论】:

  • 这段代码输出 5.54999999999999937827510621010.54999999999999937827510621 这对我来说看起来像十进制。
  • 我看到很多Decimal对象...

标签: python variables decimal python-3.5


【解决方案1】:

为此,我不会使用 Decimal 对象,而只使用浮点数:

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

当使用浮点数作为输入来构造 Decimal 值时,您提供的值开始时并不准确。解决此问题的一种方法是提供一个字符串值作为输入并将其直接转换为十进制。

十进制实例可以由整数、字符串、浮点数、 或元组。从整数或浮点数构造执行精确 该整数或浮点数的值的转换。

这意味着在提供浮点数时,您的浮点数将具有精确、非常精确和稍微不准确的十进制值。如果您已经将浮点数作为输入处理,那么您可能希望通过量化来向下舍入该值:

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

【讨论】:

  • 我以为是自动浮动的?我意识到python在这里使用二进制计算,这就是为什么答案错误?
  • 这不是对他的问题的回答,而是建议浮动是否是更好的选择。
  • 这很好,但这与我之前尝试使用 Decimal 的方式相同。有没有办法在不四舍五入的情况下得出 5.55 的正确数字答案?
  • 不使用浮点数作为输入,因为这不是计算的确切答案。
【解决方案2】:

试试

decimal_odds = Decimal("2.11")

... 这让 Decimal 以 exact 值而不是浮点近似值开头。那么最终结果就是Decimal('5.55')

另一方面,仅使用浮点值只会减少 1.9 * 10-14 % - 下注实际上必须达到 0.5 万亿美元,才能减少一美分的支出。

【讨论】:

    【解决方案3】:

    问题在于表达式Decimal(2.11)。没有像 2.11 这样的数字 - 至少不是普通的浮点数,这就是这里的参数:可以准确表示为浮点数的最接近的值实际上是 2.109999999999999875655。然后 Decimal 类 exactly 表示该不精确值。如果你想要一个精确的小数,你必须用一个精确的值来构造它:Decimal("2.11") 会自己进行转换,而无需经过浮点格式,因此不会引入不准确性。

    【讨论】:

      猜你喜欢
      • 2021-05-31
      • 1970-01-01
      • 2018-08-24
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-11
      • 1970-01-01
      相关资源
      最近更新 更多