HT_prandme 发表于 2026-1-16 16:43:44

浮点数比较

零基础入门学习Python (最新版)   课程第八讲:数字类型(上)
部分,以下代码运行结果为什么一个是False,一个是True?


"""如何精确计算浮点数"""
import decimal
a = decimal.Decimal("0.1")
b = decimal.Decimal("0.2")
print(a + b)
#0.3
print(int(a + b) == 0.3)
#False
c = decimal.Decimal("0.3")
print(a + b == c)
#True

FishC 发表于 2026-1-16 16:44:56

你好!我来帮你解释为什么这两个比较结果不同。

首先,你使用了 decimal.Decimal 来精确表示小数,避免浮点数精度问题。这里的关键是理解 int() 函数的行为。

第一个比较:
print(int(a + b) == 0.3)
输出 False 的原因:
- a + b 的结果是精确的 Decimal("0.3")。
- int(a + b) 将 0.3 转换为整数。注意,int() 会直接截断小数部分,不进行四舍五入,所以得到整数 0。
- 然后比较 0 == 0.3:左边是整数 0,右边是浮点数 0.3,它们不相等,因此结果为 False。

第二个比较:
print(a + b == c)
输出 True 的原因:
- a + b 是 Decimal("0.3")。
- c 是 Decimal("0.3")。
- 两者都是精确的 Decimal 类型,值相等,所以结果为 True。

总结:
- 使用 int() 转换小数时会丢失小数部分,导致与原始浮点数比较失败。
- 直接比较 Decimal 对象可以避免精度问题,得到正确结果。

希望这个解释对你有帮助!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

HT_prandme 发表于 2026-1-16 16:47:41

FishC 发表于 2026-1-16 16:44
你好!我来帮你解释为什么这两个比较结果不同。

首先,你使用了 decimal.Decimal 来精确表示小数,避免 ...

对哦{:5_109:},我把int函数概念记错了,多谢指正{:9_228:}
把int改成float后运行均显示True了awa

FishC 发表于 2026-1-16 16:48:02

HT_prandme 发表于 2026-01-16 16:47
FishC 发表于 2026-1-16 16:44
你好!我来帮你解释为 ...

不客气,很高兴能帮到你!{:9_228:}

你说得完全正确。把 `int(a+b)` 改成 `float(a+b)` 后,第一个比较的结果也变成了 `True`。

这里的关键原因你已经发现了:**数据类型**。

我们来简单总结一下:
- `int(0.3)` 得到整数 `0`,因为`int()`会直接丢弃小数部分。
- `float(0.3)` 得到浮点数 `0.3`。

修改后的代码逻辑如下:
`float(a+b)` 将精确的 Decimal("0.3") 转换成了一个浮点数 `0.3`,然后这个浮点数再和右边的浮点数 `0.3` 进行比较。
由于两边的值在浮点数的表示范围内是相等的,所以结果为 `True`。

不过,这里也引出了一个重要的编程经验:
虽然在这个特定例子里 `float()` 转换后比较成功了,但在更复杂的金融或科学计算中,如果对精度要求极高,通常**不推荐**将高精度的 `Decimal` 对象转换为 `float` 再进行比较。因为 `float` 本身存在固有的精度限制,转换过程可能会重新引入微小的舍入误差。

最佳实践是像你第二个比较那样,**让同类型的精确对象进行比较**:
`Decimal对象 == Decimal对象`
这样可以始终保证最高的比较精度。

你能通过动手尝试来验证和理解这个概念,这是非常棒的学习方式!继续加油!{:9_246:}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 浮点数比较