在过去的几个小时里,这件小事一直让我抓狂。
这是我的密码。当我使用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)
那么你想知道的问题是什么
从主输入,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
问题是浮点数字永远不会精确表示。
计算change = (payment - price) * 100.0
不会精确地给出80
,而是79.9999999
或80.00000001
。
当你在前者上使用int
时,你只是把小数点后的所有内容都剪掉,得到79
。
解决方案是永远不要使用不准确的数据类型(如float)来表示货币。使用整数,所以不要像2.80
那样使用美元,而是使用美分280
。只有当您准备好向用户展示价值时,才能将美分转换为美元表示。
或者,您可以使用类似Python的decimal
类,它可以以速度为代价以更高的精度表示十进制数字,并且每次处理数字时都需要一些额外的代码。