python保留位问题


这条用例,未保留小数时结果为:-30.825,保留2位小数时,预期结果应为-30.83,现状-30.82对应不上,如何处理

要想精确运算用 decimal

应该如何实现呢?


改成如图的方式还是不对

参考下这文档吧,这个跟浮点数类型有关。
https://docs.python.org/3/library/functions.html#round

>>> format(0.825, '.17f')
'0.82499999999999996'

浮点数的0.825其实是用’0.82499999999999996’表示的。。。所以四舍五入就成了0.82

老师,我看了文档中关于round的介绍,但是这还是不能解决我这条用例会执行失败的问题呢,从用例预期结果的角度是没错的,具体代码如何写才能达到验证这条用例的效果呢?


改成比对三位小数可以了,这种数据是只能修改比对位数处理么,是否有保留2位小数可以实现的验证方法呢?

可以用这个办法去判断浮点数是否接近。

>>> import math
>>> a = 5.0
>>> b = 4.99998
>>> math.isclose(a, b, abs_tol=0.00003)
True
>>> math.isclose(a, b, abs_tol=0.00001)
False

或者用这个获得四舍五入

>>> Decimal('13.825').quantize(Decimal("0.00"), rounding=decimal.ROUND_HALF_UP)
Decimal('13.83')
>>> Decimal(13.825).quantize(Decimal("0.00"), rounding=decimal.ROUND_HALF_UP)
Decimal('13.82')

需要注意的是这两个表达方式的区别

>>> Decimal('13.825')
Decimal('13.825')
>>> Decimal(13.825)
Decimal('13.824999999999999289457264239899814128875732421875')

Decimal(13.825)变化的原因是13.825首先被python变成了浮点数,这个时候再传给Decimal就已经不准了。所以要用字符串传递,才是真正的精准数字 Decimal(‘13.825’)


可以了,谢谢老师