python中的基本浮动减法

问题描述

我有两个浮点值,我想将它们相减并将结果与​​ if 语句中的另一个值进行比较。 问题,我没有设法得到预期的结果。 我尝试使用 Decimal module

from decimal import Decimal,getcontext    
getcontext().prec = 3
value_1 = 60.32
value_2 = 59.72
condition = 0.6

sub = Decimal(value_1) - Decimal(value_2)

但是,

sub <= condition
FALSE

sub <= Decimal(condition)
FALSE

解决方法

这个答案解释了为什么这个问题是 Is floating point math broken? 的骗子。


如果你使用

 k = Decimal(0.6)

并检查您得到的 k

is floating math broken

这是一个“浮动数学被破坏”的案例:

  • 数字 0.6 首先转换为浮点数(给出最接近的浮点数近似值)
  • 浮点数被传递给 Decimal 构造函数,它尽职尽责地构造一个 Decimal,它比最初放在源代码中的 0.6 小一点。

您可以通过向十进制构造函数提供数字字符串来避免这种情况,而不是绕过“浮点数”转换。

检查

value_1 = 60.32
value_2 = 59.72
sub = Decimal(value_1) - Decimal(value_2)

导致:

exactly 0.6

正好是 0.6。由于 k 现在略小于 0.6,因此您对 sub <= k 的测试返回 False

您可以使用 k = Decimal("0.6") 获得精确为 0.6 的十进制值。