Python中奇怪的算术/舍入行为



在过去的几个小时里,这件小事一直让我抓狂。

这是我的密码。当我使用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.999999980.00000001

当你在前者上使用int时,你只是把小数点后的所有内容都剪掉,得到79

解决方案是永远不要使用不准确的数据类型(如float)来表示货币。使用整数,所以不要像2.80那样使用美元,而是使用美分280。只有当您准备好向用户展示价值时,才能将美分转换为美元表示。

或者,您可以使用类似Python的decimal类,它可以以速度为代价以更高的精度表示十进制数字,并且每次处理数字时都需要一些额外的代码。

相关内容

  • 没有找到相关文章

最新更新