我希望能够在 Python 中比较小数。为了用钱进行计算,聪明的人告诉我使用小数而不是 float ,我就这样做了。但是,如果我想验证计算是否产生了预期的结果,我该怎么做呢?
>>> a = Decimal(1./3.)
>>> a
Decimal('0.333333333333333314829616256247390992939472198486328125')
>>> b = Decimal(2./3.)
>>> b
Decimal('0.66666666666666662965923251249478198587894439697265625')
>>> a == b
False
>>> a == b - a
False
>>> a == b - Decimal(1./3.)
False
所以在这个例子中 a = 1/3 和 b = 2/3,很明显 b-a = 1/3 = a,但是,这不能用小数来完成。
我猜一种方法是说我希望结果为 1/3,在 python 中我将其写为
Decimal(1./3.).quantize(...)
然后我可以这样比较它:
(b-a).quantize(...) == Decimal(1./3.).quantize(...)
所以,我的问题是:是否有更简洁的方法来执行此操作?你会如何为 Decimals 编写测试?
最佳答案
您没有以正确的方式使用 Decimal
。
>>> from decimal import *
>>> Decimal(1./3.) # Your code
Decimal('0.333333333333333314829616256247390992939472198486328125')
>>> Decimal("1")/Decimal("3") # My code
Decimal('0.3333333333333333333333333333')
在“您的代码”中,您实际上执行了“经典”浮点除法——然后将结果转换为小数。 floats 引入的错误会传播到您的 Decimal。
在“我的代码”中,我进行了十进制 除法。生成直到最后一位的正确(但被截断)的结果。
关于四舍五入。如果您处理货币数据,则必须知道在您的业务中用于四舍五入的规则。如果不是这样,使用 Decimal
将 不会 自动解决所有问题。举个例子:3 位股东分享 100 美元。
>>> TWOPLACES = Decimal(10) ** -2
>>> dividende = Decimal("100.00")
>>> john = (dividende / Decimal("3")).quantize(TWOPLACES)
>>> john
Decimal('33.33')
>>> paul = (dividende / Decimal("3")).quantize(TWOPLACES)
>>> georges = (dividende / Decimal("3")).quantize(TWOPLACES)
>>> john+paul+georges
Decimal('99.99')
糟糕:缺少 $.01(银行的免费礼物?)
关于python - 在 python 中比较小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17314028/