如何在Django中比较浮点值
你好,我需要在我的项目中比较一个浮点数的值,我使用了以下代码:
if style_score.style_quiz_score ==float(17.40):
但是这个代码对17.40这个值不管用,不过当我把值改成17的时候,它就能正常工作了。请告诉我,我该怎么比较浮点数的值。
2 个回答
2
这是因为浮点数在计算时会出现舍入误差。不要用 ==
来比较浮点数,应该总是使用这个模板:
def floats_are_the_same(a,b): return abs(a-b) < 1e-6
if floats_are_the_same(value, 17.4):
....
也就是说,要检查这个值是否和你想要的值 接近。这是因为浮点数的运算几乎总是会有舍入误差:
>>> 17.1 + 0.3
17.400000000000002
2
在Python(或者任何依赖底层硬件表示浮点数的语言)中,比较浮点数总是比较棘手的事情。最好的办法是定义一个容忍度,也就是说在这个范围内你可以认为两个数字是相等的(比如说,10^-6
),然后检查这两个数字之间的绝对差值是否小于你的容忍度。
代码:
TOLERANCE=10**-6
def are_floats_equal(a,b):
return abs(a-b) <= TOLERANCE
另外,如果你真的非常想要对浮点数进行精确的、任意精度的计算,可以使用decimal模块。顺便提一下,那一页有一些关于普通浮点数失败点的好例子。不过,要注意的是,这种方法比使用普通浮点数要慢得多,所以除非你真的非常需要,不然就不要这样做。