风向 网站影楼做网站

张小明 2026/1/2 10:37:07
风向 网站,影楼做网站,营销网站建设都是专业技术人员,黄石本土做网站的公司目录Python 浮点数陷阱#xff1a;为什么 0.1 0.2 不等于 0.3#xff1f;深入解析与解决方案浮点数的“世纪难题”#xff1a;从一个简单的断言失败说起1.1 为什么计算机“算不对”#xff1a;二进制的原罪1.2 看看真相#xff1a;使用 math.fsum 和 decimal 验证2. 浮点…目录Python 浮点数陷阱为什么 0.1 0.2 不等于 0.3深入解析与解决方案浮点数的“世纪难题”从一个简单的断言失败说起1.1 为什么计算机“算不对”二进制的原罪1.2 看看真相使用 math.fsum 和 decimal 验证2. 浮点数陷阱在实际开发中的“杀伤力”2.1 循环控制的“死循环”风险2.2 金融计算中的“分”毫厘差2.3 numpy 中的 np.isclose 与 np.allclose3. 终极解决方案如何优雅地处理浮点数3.1 方案一容忍误差Epsilon 比较法3.2 方案二精确计算decimal 模块3.3 方案三重载运算符面向对象封装4. 总结与最佳实践专栏导读 欢迎来到Python办公自动化专栏—Python处理办公问题解放您的双手️‍ 个人博客主页请点击—— 个人的博客主页 求收藏️‍ Github主页请点击—— Github主页 求Star⭐️‍ 知乎主页请点击—— 知乎主页 求关注️‍ CSDN博客主页请点击—— CSDN的博客主页 求关注 该系列文章专栏请点击——Python办公自动化专栏 求订阅 此外还有爬虫专栏请点击——Python爬虫基础专栏 求订阅 此外还有python基础专栏请点击——Python基础学习专栏 求订阅文章作者技术和水平有限如果文中出现错误希望大家能指正❤️ 欢迎各位佬关注 ❤️Python 浮点数陷阱为什么 0.1 0.2 不等于 0.3深入解析与解决方案浮点数的“世纪难题”从一个简单的断言失败说起在 Python 编程中如果你是一名初学者或者哪怕是有经验的开发者很可能都遇到过这样一个令人困惑的现象0.10.20.3False直觉告诉我们这显然是错误的。但在计算机的世界里这却是铁一般的事实。如果你在金融计算、数据统计或者任何涉及高精度数值的场景中忽略了这个细节后果可能不仅仅是打印出一个错误的False而是导致严重的资金误差、科学计算偏差甚至系统崩溃。本篇文章将带你彻底揭开 Python 浮点数背后的神秘面纱从二进制表示的底层逻辑到实际开发中必须掌握的避坑指南再到终极的高精度解决方案。这不仅是一个简单的知识点更是通往稳健代码的必经之路。1.1 为什么计算机“算不对”二进制的原罪要理解这个问题我们首先需要明白计算机是如何存储数字的。计算机底层使用的是二进制0 和 1而人类习惯使用的是十进制。在十进制中我们可以很容易地表示1/3为0.333333...无限循环但在计算机有限的存储空间里它只能被截断为一个近似值。同理在二进制中很多在十进制里看起来很“整”的小数其实是无限循环小数。关键点十进制小数转二进制通过乘以 2 取整数部分的方法。0.1 的二进制0.1 (10进制) 0.000110011001100110011001100110011... (2进制)。这是一个无限循环小数。0.2 的二进制0.2 (10进制) 0.00110011001100110011001100110011... (2进制)。同样无限循环。由于计算机如使用 IEEE 754 标准的 CPU只能存储有限位数它必须对这些无限循环的二进制数进行舍入Rounding。因此0.1和0.2在计算机中存储的其实是它们的近似值。当这两个近似值相加时误差累积导致结果不等于0.3的近似值。1.2 看看真相使用math.fsum和decimal验证为了直观地看到这个误差我们可以使用 Python 的struct模块将浮点数转换为二进制表示或者使用内置函数来查看更精确的计算结果。importdecimal# 设置精度为 30 位decimal.getcontext().prec30adecimal.Decimal(0.1)bdecimal.Decimal(0.2)cdecimal.Decimal(0.3)print(fDecimal计算:{ab})print(f是否相等:{abc})# 对比普通浮点数print(f普通浮点数:{0.10.2})输出结果Decimal计算: 0.30000000000000000000000000000 是否相等: True 普通浮点数: 0.30000000000000004看普通浮点数计算出的结果其实是0.30000000000000004这就是为什么0.1 0.2 ! 0.3的根本原因。2. 浮点数陷阱在实际开发中的“杀伤力”理解了原理我们还需要知道它在哪些场景下会变成真正的“Bug”。很多开发者认为只要不直接比较相等就没问题但在以下场景中隐患无处不在。2.1 循环控制的“死循环”风险这是最容易被忽视的陷阱之一。如果你试图用浮点数作为循环的步长或终止条件可能会遇到无限循环或提前终止。错误案例x0.0whilex!1.0:print(x)x0.1ifx2.0:break# 防止死循环的安全阀在某些情况下由于累积误差x可能会变成0.9999999999999999永远不等于1.0导致死循环。正确做法永远不要用比较浮点数而是比较它们的差值是否小于一个极小值Epsilon。EPSILON1e-10whileabs(x-1.0)EPSILON:# ...2.2 金融计算中的“分”毫厘差在金融领域精度就是金钱。假设你正在编写一个银行利息计算系统defcalculate_interest(principal,rate):returnprincipal*rate# 假设本金 10000日利率 0.0001 (万分之一)# 计算 10000 天的利息interest0for_inrange(10000):interestcalculate_interest(10000,0.0001)print(interest)# 理论上应该是 10000.0# 实际运行结果可能是 9999.999999990658如果系统需要根据总金额进行分润这个微小的误差会被放大导致账目不平。对于这类问题严禁使用float类型必须使用decimal模块或整数以分为单位存储金额。2.3numpy中的np.isclose与np.allclose在数据科学领域我们经常使用numpy进行矩阵运算。numpy提供了专门的函数来处理浮点数比较。np.isclose(a, b): 逐个元素比较两个数组是否在容差范围内接近。np.allclose(a, b): 判断两个数组是否在容差范围内全量接近。importnumpyasnp anp.array([0.10.2])bnp.array([0.3])print(np.allclose(a,b))# 输出: True这是在科学计算中进行浮点数比较的标准范式。3. 终极解决方案如何优雅地处理浮点数既然浮点数这么难用我们该如何在 Python 中彻底解决或规避它根据不同的业务场景有三种层级的解决方案。3.1 方案一容忍误差Epsilon 比较法适用于一般科学计算、游戏开发等对精度要求不是极端苛刻但需要判断相等性的场景。核心思想只要两个数的差值的绝对值小于一个极小的阈值就认为它们相等。Python 3.5 引入了math.isclose函数这是标准库推荐的做法importmath# 默认相对容差 1e-09绝对容差 0.0# 即abs(a-b) max(rel_tol * max(|a|, |b|), abs_tol)print(math.isclose(0.10.2,0.3))# Trueprint(math.isclose(1000000000000000.01,1000000000000000.02))# True自定义实现如果你使用的是旧版本 Python可以这样写deffloat_equal(a,b,epsilon1e-9):returnabs(a-b)epsilon3.2 方案二精确计算decimal模块适用于金融、会计、税务等商业计算。decimal模块通过软件模拟实现了十进制运算完全避免了二进制浮点数的误差。使用要点初始化对象必须使用字符串初始化Decimal对象。如果使用浮点数初始化误差在传入的那一刻就已经产生了。控制精度可以通过getcontext().prec设置全局精度。fromdecimalimportDecimal,getcontext,ROUND_HALF_UP# 设置精度为 4 位getcontext().prec4# 正确的初始化方式priceDecimal(19.99)quantityDecimal(3)discountDecimal(0.05)# 5% 折扣# 计算总价totalprice*quantity*(1-discount)print(total)# 输出: 57.00 (保留4位有效数字)# 四舍五入处理tax_rateDecimal(0.08)taxtotal*tax_rate# ROUND_HALF_UP 是我们熟悉的银行家舍入法四舍五入final_totaltotal.quantize(Decimal(0.00),roundingROUND_HALF_UP)print(final_total)性能提示decimal的运算速度比浮点数慢得多。如果在高性能计算如高频交易的实时撮合中通常会转而使用整数以最小货币单位如“分”进行计算最后再格式化展示。3.3 方案三重载运算符面向对象封装这是进阶的工程化方案。如果你正在开发一个涉及大量数值计算的系统且希望代码具有极高的可读性和安全性可以创建一个专门的类来封装数值。通过运算符重载Operator Overloading我们可以让自定义类支持,-,*,/等操作符但内部强制使用Decimal进行计算。fromdecimalimportDecimalclassMoney:def__init__(self,amount,currencyCNY):# 强制转换为 Decimal确保精度self.amountDecimal(str(amount))self.currencycurrencydef__add__(self,other):ifnotisinstance(other,Money):raiseTypeError(只能与 Money 类型相加)ifself.currency!other.currency:raiseValueError(货币类型不匹配)new_amountself.amountother.amountreturnMoney(new_amount,self.currency)def__eq__(self,other):ifnotisinstance(other,Money):returnFalsereturnself.amountother.amountandself.currencyother.currencydef__str__(self):returnf{self.amount}{self.currency}# 使用示例m1Money(0.1)m2Money(0.2)m3Money(0.3)print(m1m2m3)# 输出: Trueprint(m1m2)# 输出: 0.3000000000000000166533453694 CNY (取决于精度设置)# 但逻辑判断是完全正确的这种方式将复杂的Decimal处理逻辑隐藏在类内部对外提供清晰的接口非常适合构建中大型项目。4. 总结与最佳实践Python 的浮点数问题并不是 Python 语言本身的缺陷而是所有遵循 IEEE 754 标准的编程语言C, Java, JavaScript 等共同面临的挑战。核心观点回顾原理浮点数是二进制下的近似值无法精确表示所有十进制小数。比较永远不要直接使用比较浮点数使用math.isclose或判断差值。存储涉及钱必须用Decimal或整数千万不要用 float。科学计算善用numpy提供的向量化比较工具。最后的建议在编写代码时请根据业务场景选择合适的工具。如果是简单的绘图或物理模拟浮点数完全够用但如果是处理用户的银行卡余额请务必对浮点数保持敬畏之心。互动话题你在项目中遇到过哪些因为浮点数精度导致的“灵异”Bug欢迎在评论区分享你的经历让我们一起避坑结尾希望对初学者有帮助致力于办公自动化的小小程序员一枚希望能得到大家的【❤️一个免费关注❤️】感谢求个 关注 ❤️ 喜欢 ❤️ 收藏 此外还有办公自动化专栏欢迎大家订阅Python办公自动化专栏此外还有爬虫专栏欢迎大家订阅Python爬虫基础专栏此外还有Python基础专栏欢迎大家订阅Python基础学习专栏
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

重庆网站建设 cqhtwl网站底部设计源码

时空因果卷积神经网络(ST-CausalConvNet)提出的模型的显著特征是模型架构中的卷积是因果的,其中某个时间步长的输出仅与前一层中相同或更早时间步长的元素进行卷积。 因此,该模型不存在从未来到过去的信息泄漏。 模型还考虑了多个监测站之间的空间相关性…

张小明 2026/1/2 2:28:45 网站建设

宿迁做网站哪家公司好wordpress中文清爽博客主题:jishuzh主题分享

彼得林奇如何看待公司的员工福利政策对生产力的影响 关键词:彼得林奇、员工福利政策、生产力、公司发展、投资分析 摘要:本文聚焦于彼得林奇对于公司员工福利政策对生产力影响的观点。通过深入剖析彼得林奇的投资理念和对公司基本面的研究思路,探讨员工福利政策在提升员工满…

张小明 2025/12/31 19:24:34 网站建设

唐山哪里有建设网站的河北省建设网站的网站首页

你是否曾梦想将手机里的普通照片转化为栩栩如生的3D模型?想象一下,用祖母留下的老照片重建她最心爱的花瓶,或者为电商产品制作可360度旋转的3D展示。这一切,Meshroom都能帮你实现!这款开源免费的3D重建软件正在改变我们…

张小明 2026/1/1 22:46:05 网站建设

邢台网站建设博客网站登录

如何快速去除视频硬字幕?AI神器video-subtitle-remover完整教程 【免费下载链接】video-subtitle-remover 基于AI的图片/视频硬字幕去除、文本水印去除,无损分辨率生成去字幕、去水印后的图片/视频文件。无需申请第三方API,本地实现。AI-base…

张小明 2026/1/2 12:25:29 网站建设

做cg的网站在网站上做送餐外卖需要哪些资质

PyTorch-CUDA-v2.6镜像在法律文书智能生成中的探索 在法律科技的实际落地过程中,一个看似不起眼的环境配置问题,往往能拖慢整个项目的节奏。设想一下:团队中三位研究员分别在不同系统上调试同一个法律文本生成模型,一人用 Ubuntu …

张小明 2025/12/31 19:22:26 网站建设

沈阳网官方网站永州网站建设收费情况

3步搞定lazy.nvim中文界面:告别英文困扰的终极方案 【免费下载链接】lazy.nvim 💤 A modern plugin manager for Neovim 项目地址: https://gitcode.com/GitHub_Trending/la/lazy.nvim 还在为lazy.nvim的英文界面发愁吗?每次打开插件管…

张小明 2026/1/2 14:20:12 网站建设