过去几个小时,这件小事让我发疯。
这是我的代码。当我用int()
来舍入一些数字时,我注意到了这个问题。您可以看到我正在打印浮点数和整数答案以进行比较。
class Payment:
def __init__(self):
self.coins = [0.25, 0.5, 1, 3, 15, 75]
def get_change(self, price, payment):
change = (payment - price) * 100.0
self.calculate_change(change)
def calculate_change(self, change):
for coin in self.coins:
print change / coin, int(change / coin)
在我的主要内容中我有:
from Temp import Payment
t = Payment()
t.get_change(2.0, 2.80)
在Main输入中,change
的值恰好为80,并传递给calculate_change
。现在,看一下输出
320.0 319
160.0 159
80.0 79
26.6666666667 26
5.33333333333 5
1.06666666667 1
舍入的值偏离1.这很奇怪。
但是,如果我只是在Main中调用calculate_change
函数:
t.calculate_change(80)
我得到了预期的结果:
320.0 320
160.0 160
80 80
26 26
5 5
1 1
所以问题出在get_change
函数的某个地方。这条线导致问题的是什么?
change = (payment - price) * 100.0
答案 0 :(得分:1)
问题是浮点数从未准确表示。
计算change = (payment - price) * 100.0
不会完全为您80
提供79.9999999
或80.00000001
。
当你对前者使用int
时,你只是砍掉小数点后的所有内容并获得79
。
解决方案是永远不要使用不准确的数据类型(如float)来代表金钱。使用整数,所以使用美分2.80
而不是像280
那样的美元。只有当您准备好向用户展示价值时,您才能将美分换算成美分。
或者,您可以使用Python的decimal
类,它可以以速度为代价,以更高的精度表示十进制数,每次使用数字时都需要一些额外的代码。