0.1 <= 0.10 返回 false

-2 投票
2 回答
64 浏览
提问于 2025-04-12 12:32

我正在写一个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

撰写回答