您是否可以帮助我理解为什么我在AssertionError
中通过以下简单测试获得pytest
?
这是测试函数conventer.py
from decimal import Decimal
TWO = Decimal(10) ** -2
def us_to_dec(odds=100):
if odds >= 0:
return Decimal((odds / 100) + 1).quantize(TWO)
else:
return Decimal((100 / odds) + 1).quantize(TWO)
在conventer py上的print语句返回预期结果
print(us_to_dec(odds=205))
3.05
这是测试返回断言错误test_conventer.py
from surebet import converter
def test_us_to_dec():
assert converter.us_to_dec(odds=205) == 3.05
测试失败并显示以下输出
E AssertionError: assert Decimal('3.05') == 3.05
E + where Decimal('3.05') = <function us_to_dec at 0x106c99598>(odds=205)
E + where <function us_to_dec at 0x106c99598> = converter.us_to_dec
tests/test_converter.py:16: AssertionError
我不知道为什么我会收到AssertionError
编辑:
如果其他人遇到同样的情况,我最终会做以下事情:
from pytest import approx
from decimal import Decimal
from surebet import converter
def test_us_to_dec():
assert converter.us_to_dec(odds=205) == approx(Decimal(3.05))
简单地比较converter.us_to_dec(odds=205) == approx(3.05)
会导致TypeError
答案 0 :(得分:3)
Decimal((205 / 100) + 1).quantize(Decimal(10) ** -2) == Decimal('3.05')
# --> True
Decimal((205 / 100) + 1).quantize(Decimal(10) ** -2) == 3.05
# --> False
由于浮点算术的限制,即使它们具有相同的repr,也不能保证十进制值等于float
值。在这种情况下,3.05
无法用二进制表示,因此当比较两个值时,3.05
将转换为
Decimal(3.05) == Decimal('3.04999999999999982236431605997495353221893310546875')
在进行比较之前。