Python

时间:2016-01-11 21:46:32

标签: python math rounding floating-accuracy

过去几个小时,这件小事让我发疯。

这是我的代码。当我用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

1 个答案:

答案 0 :(得分:1)

问题是浮点数从未准确表示。

计算change = (payment - price) * 100.0不会完全为您80提供79.999999980.00000001

当你对前者使用int时,你只是砍掉小数点后的所有内容并获得79

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

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