python - 在 python 中比较小数

标签 python testing decimal

我希望能够在 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/

相关文章:

testing - Click DIV在IE中没有进行 “real”点击操作

java - JSON 解码去除小数尾随零

javascript - 如何将小数四舍五入到最接近的分数?

python - 使用 Python 遍历前缀

python - 使用pycharm时如何获取pyplot的交互图

python - 使用 Python 进行 IE 自动化测试的最佳库是什么?

ruby-on-rails-3 - Rails 3 功能测试 : Can't mass-assign protected attributes: controller, 操作

python - 使用 cppyy 从 Python 解析 C (C++) 调用方法

python - Opencv流媒体太慢

java - 最后出现在 1 之后的数字 '0' 在从十进制数转换时会丢失在二进制数中