python - python 中 int(x) 的奇怪行为

标签 python floating-point int

运行该程序时,

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 是一个 float ,实际上不是 1,而是被下限为 0

旁注:删除便士上的 int 函数并用 %.0f pennies 替换是可行的。

我想这正是人们所说的在处理金钱时不要使用 float 时所说的内容。 :)

最佳答案

I know for certain as well that change / 0.01 is equal to 1.0

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

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

关于python - python 中 int(x) 的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18158471/

相关文章:

Python 数据结构开销/性能

python - 在 Python 中递增版本号

c++ - C++将数字和逗号的char数组转换为整数列表?

python - 从其符号、指数和显着性的字符串表示中返回 Python float

c++ - 不一致造成的static_cast困惑

python - dialogflow - 如何获取 session ID?

python - 二进制数据转换缓慢

python - 如果我只切出 1 列与切出多列,为什么 numpy 的行为会有所不同?

python - 为什么 -0.0 与 0.0 不同?

python - 与等效的格式化选项相比,为什么 float.__repr__ 返回不同的表示?