鱼C论坛

 找回密码
 立即注册
查看: 23|回复: 3

[已解决]浮点数比较

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


  1. """如何精确计算浮点数"""
  2. import decimal
  3. a = decimal.Decimal("0.1")
  4. b = decimal.Decimal("0.2")
  5. print(a + b)
  6. #0.3
  7. print(int(a + b) == 0.3)
  8. #False
  9. c = decimal.Decimal("0.3")
  10. print(a + b == c)
  11. #True
复制代码

最佳答案
1 小时前
你好!我来帮你解释为什么这两个比较结果不同。

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

第一个比较:
  1. 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

第二个比较:
  1. print(a + b == c)
复制代码

输出 True 的原因:
- a + bDecimal("0.3")
- cDecimal("0.3")
- 两者都是精确的 Decimal 类型,值相等,所以结果为 True

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

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

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

运行结果

运行结果

代码图片

代码图片
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层    本楼为最佳答案   
你好!我来帮你解释为什么这两个比较结果不同。

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

第一个比较:
  1. 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

第二个比较:
  1. print(a + b == c)
复制代码

输出 True 的原因:
- a + bDecimal("0.3")
- cDecimal("0.3")
- 两者都是精确的 Decimal 类型,值相等,所以结果为 True

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 1 小时前 | 显示全部楼层
FishC 发表于 2026-1-16 16:44
你好!我来帮你解释为什么这两个比较结果不同。

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

对哦,我把int函数概念记错了,多谢指正
把int改成float后运行均显示True了awa
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 1 小时前 | 显示全部楼层
HT_prandme 发表于 2026-01-16 16:47
FishC 发表于 2026-1-16 16:44
你好!我来帮你解释为 ...


不客气,很高兴能帮到你!

你说得完全正确。把 `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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-16 18:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表