【问题标题】:Odd behavior of int(x) in pythonpython中int(x)的奇怪行为
【发布时间】:2013-08-10 03:52:44
【问题描述】:

运行此程序时,

cost = 12
money = 12.51
change = money - cost

dollars = int(change)
change -= dollars

quarters = int(change / 0.25)
change -= quarters * 0.25

dimes = int(change / 0.1)
change -= dimes * 0.1

nickels = int(change / 0.05)
change -= nickels * 0.05

pennies = int(change / 0.01)

print("""Your change is:
    %i dollars
    %i quarters
    %i dimes
    %i nickels
    %i pennies
""" % (dollars, quarters, dimes, nickels, pennies))

输出是

Your change is:
    0 dollars
    2 quarters
    0 dimes
    0 nickels
    0 pennies

为什么硬币是 0?我试过单独打印便士,同样的事情发生了。我也肯定知道change / 0.01 等于1.0。出于某种原因,int(1.0) 似乎等于0。显然,事实并非如此。也许1.0 是一个浮点数,实际上不是 1 并被取底为0

旁注:删除硬币上的 int 函数并替换为 %.0f pennies 有效。

我想这正是人们说在处理金钱时不要使用浮点数时所谈论的。 :)

【问题讨论】:

    标签: python floating-point int


    【解决方案1】:

    我也很确定 change / 0.01 等于 1.0

    嗯,不完全是。如果您尝试直接从 Python 解释器执行 change / 0.01,由于浮点错误,它会返回类似 0.99999999999787 的内容。当然,如果您尝试将其转换为 int,它会向下舍入为零。

    为避免这种情况,您可以尝试以下两种方法之一。您可以尝试使用 Python 中的 decimal 模块,它确实可以避免此类浮点错误,或者您可以在一开始就将 change 乘以 100,这样您就可以处理整数值,而不是浮点数,并且相应地修改其余代码。

    【讨论】:

    • 酷。我以为这就是发生的事情。很奇怪,python 在执行change / 0.01 时会打印1.0。如果你问我,这会很误导。
    【解决方案2】:

    我完成的代码:

    cost = input("What is the cost in dollars? ")
    money = input("Money given: ")
    change = int(round(money - cost) * 100)
    
    if change < 0:
        print("You didn't pay enough!")
        exit()
    
    dollars = change / 100
    change %= 100
    
    quarters = change / 25
    change %= 25
    
    dimes = change / 10
    change %= 10
    
    nickels = change / 5
    change %= 5
    
    pennies = change
    
    print("""Your change is:
        %i dollars
        %i quarters
        %i dimes
        %i nickels
        %i pennies
    """ % (dollars, quarters, dimes, nickels, pennies))
    

    【讨论】:

    • round(money - cost, 2) 的结果仍然是一个近似值,因为它的单位是百分之一美元,而 1/100 不能完全用二进制浮点表示。 change = round((money - cost) * 100) 会更好。
    【解决方案3】:

    %.0f 对数字进行四舍五入,而 %i 不这样做。另外,学习数学!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 2017-10-16
      • 2012-10-03
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多