0.1 <= 0.10 返回 false
我正在写一个Python脚本,但在比较小数值时,结果和我预期的不太一样。我从SQL查询中获取了一个值,这个值精确到40位小数。而当我把它和Python生成的0.1进行比较时,Python的0.1却被认为比SQL的0.1大。我知道这和数字的四舍五入有关,但我该怎么解决这个问题呢?我可以给SQL的数字加上0.0000001,但我更希望有个更简单的方法。请看我下面的例子。
print(f"Dist: {round(abs(dist),2):.40f}, t.min_dbv: {round(0.10,2):.40f}")
print(f"Test 1: {round(abs(dist),2) <= round(0.10,2)}")
print(f"Dist: {round(abs(dist),2):.40f}, t.min_dbv: {round(t.min_dbv,2):.40f}")
print(f"Test 2: {round(abs(dist),2) <= round(t.min_dbv,2)}")
print(f"Dist: {Decimal(abs(dist)):.40f}, t.min_dbv: {Decimal(t.min_dbv):.40f}")
print(f"Test 3: {Decimal(abs(dist)) <= Decimal(t.min_dbv)}")
这段代码返回了以下结果
Dist: 0.1000000000000000055511151231257827021182, t.min_dbv: 0.1000000000000000055511151231257827021182
Test 1: True
Dist: 0.1000000000000000055511151231257827021182, t.min_dbv: 0.1000000000000000000000000000000000000000
Test 2: False
Dist: 0.1000000000000000055511151231257827021182, t.min_dbv: 0.1000000000000000000000000000000000000000
Test 3: False
正如你所看到的,我尝试了round和Decimal这两种方法
2 个回答
0
这是浮点数常见的问题。因为浮点数之间可能会有一些小的差别,所以你需要设置一个阈值,并根据这个阈值来判断。
threshold = 0.0000001
abs(a-b) <= threshold
你只需要检查两个数值之间的差异是否小于这个阈值。如果差异在这个阈值之内,你就可以认为这个差异是可以接受的,可以继续使用这些数值。
1
谢谢你们的解释和快速回复。
我用以下代码解决了这个问题。其实就是把它先转成字符串,然后再转回小数。可能不是最正确的方法,但对我来说是最简单的。
Decimal(np.format_float_positional(abs(dist))) <= t.min_dbv