Python 浮点数运算之谜:深入解析round(0.675, 2)等输出异常

news2025/5/17 8:09:59

一、问题背景:当浮点数运算遇见 “反直觉” 结果

在 Python 开发中,以下代码输出常让开发者困惑:

print(round(0.675, 2))       # 预期0.67,实际0.68||预期0.68,实际0.67  
print(0.1 + 0.2)             # 预期0.3,实际0.30000000000000004  
print(round(2.675, 2))       # 预期2.68,实际2.67  

这些 “反直觉” 结果并非 Bug,而是由浮点数的二进制存储机制与舍入规则共同导致。本文将从底层原理出发,看透浮点数运算的本质。

二、核心代码与运行结果对比表

代码行预期输出实际输出核心原因
round(0.675, 2)0.670.68存储值略大于 0.675,触发五入规则
0.1 + 0.20.30.30000000000000004二进制无法精确表示十进制小数
round(2.675, 2)0.682.67存储值略小于 2.675,触发四舍规则
1/30.333...0.3333333333333333无限循环小数的浮点数近似存储
2 + 1/32.333...2.3333333333333335误差在加法中累积暴露

三、逐行解析:浮点数运算的核心机制

1. round (0.675, 2)=0.68:存储偏差触发 “五入” 规则

 存储真相
  • 十进制0.675的二进制表示为无限循环小数:0.1010110011001100...
  • IEEE 754 双精度浮点数(64 位)仅存储 52 位尾数,实际存储值为 0.67500000000000004440892098500626(略大于理论值)
from decimal import Decimal  
print("0.675存储值:", Decimal(0.675))  
# 输出:0.6750000000000000444089209850062616169452667236328125  

​

 

 舍入逻辑
  • 保留两位小数时,第三位实际为5(因存储值略大),触发 “四舍六入五成双” 规则(银行家舍入法):
    • 前一位7是奇数,进位后变为偶数8,最终结果为0.68

2. 0.1+0.2≠0.3:二进制存储的无限循环

 二进制困境
  • 0.1的二进制表示:0.0001100110011001100110011001100110011001100110011001101(无限循环)
  • 0.2的二进制表示:0.001100110011001100110011001100110011001100110011001101(无限循环)
  • 计算机只能存储截断后的近似值,导致累加误差:
    print("0.1存储值:", Decimal(0.1))  
    # 输出:0.1000000000000000055511151231257827021181583404541015625  
    
 误差影响
  • 实际累加值为0.30000000000000004440892098500626,打印时显示为0.30000000000000004

3. round (2.675, 2)=2.67:存储偏差导致 “四舍”

 存储特性
  • 2.675的实际存储值为2.67499999999999982236431605997495(略小于理论值):
    print("2.675存储值:", Decimal(2.675))  
    # 输出:2.67499999999999982236431605997495353221893310546875  
    
舍入逻辑
  • 第三位实际为4(因存储值略小),小于 5,触发普通四舍五入的 “舍” 操作,结果为2.67

4. 1/3 与 2+1/3:误差的隐藏与暴露

 无限循环的宿命
  • 1/3的二进制表示为0.010101010101...(无限循环),存储为近似值0.3333333333333333148296
    print("1/3存储值:", Decimal(1/3))  
    # 输出:0.333333333333333314829616256247390992939472198486328125  
    
 误差传递
  • 整数2为精确值,与1/3的近似值相加时,尾部误差0.000000000000000148296累积,最终结果为2.3333333333333335

四、浮点数运算避坑指南:从原理到实践

1. 精确计算:用 decimal 模块实现高精度

from decimal import Decimal, ROUND_HALF_UP  
# 场景1:精确四舍五入  
print(Decimal('0.675').quantize(Decimal('0.00'), rounding=ROUND_HALF_UP))  # 0.68  
# 场景2:避免累加误差  
print(Decimal('0.1') + Decimal('0.2'))                                    # 0.3  

2. 对比判断:用误差范围替代 “==”

def is_close(a, b, tolerance=1e-9):  
    return abs(a - b) < tolerance  
print(is_close(0.1+0.2, 0.3))  # True(忽略微小误差)  

3. 场景化选择数据类型

场景推荐方案示例代码
金融计算decimal 模块Decimal('100.01') + Decimal('200.02')
科学计算(可接受误差)浮点数 + 误差控制round(x, 6)或误差范围判断
整数运算int 类型675 // 1000

五、总结

  1. 存储本质:浮点数是十进制小数的二进制近似值,必然存在精度损失;
  2. 舍入规则round()的 “银行家舍入法” 仅在末位为 5 且无后续数字时生效,否则按近似值四舍五入;
  3. 工程实践:精确场景用decimal,普通场景接受误差并做好边界判断。

理解浮点数运算的底层逻辑,才能在编程中避免 “玄学” 问题。

觉得内容有帮助?点赞收藏关注,获取更多 Python 进阶干货~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2337933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8

&#x1f339;欢迎来到《小5讲堂》&#x1f339; &#x1f339;这是《C#》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。&#x1f339; &#x1f339;温馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不对之处望指正&#xff01;&#…

极狐GitLab 注册限制如何设置?

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 注册限制 (BASIC SELF) 您可以对注册实施以下限制&#xff1a; 禁用新注册。新注册需要管理员批准。需要用户电子邮件确认。…

利用大模型实现地理领域文档中英文自动化翻译

一、 背景描述 在跨国性企业日常经营过程中&#xff0c;经常会遇到专业性较强的文档翻译的需求&#xff0c;例如法律文书、商务合同、技术文档等&#xff1b;以往遇到此类场景&#xff0c;企业内部往往需要指派专人投入数小时甚至数天来整理和翻译&#xff0c;效率低下&#x…

SGFormer:卫星-地面融合 3D 语义场景补全

论文介绍 题目&#xff1a;SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议&#xff1a;IEEE / CVF Computer Vision and Pattern Recognition Conference 论文&#xff1a;https://www.arxiv.org/abs/2503.16825 代码&#xff1a;https://githu…

Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化

一、软件介绍 文末提供源码和程序下载学习 Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化。Trinity 提供性能分析和 XAI 工具&#xff0c;非常适合深度学习系统或其他执行复杂分类或解码的模型。 二、软件作用和特征 Trinity 通过结合具有超维感知能力的不同交…

城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色介绍 城市街拍暗色电影胶片风格 Lr 调色&#xff0c;是借助 Adobe Lightroom 软件&#xff0c;为城市街拍的人像或场景照片赋予独特视觉风格的后期处理方式。旨在模拟电影胶片质感&#xff0c;营造出充满故事感与艺术感的暗色氛围&#xff0c;让照片仿佛截取于某部充满张力…

加密和解密(大语言模型)

看到很多对matlab的p文件加密方案感兴趣的。网络上技术资料比较少&#xff0c;所以&#xff0c;我让大语言模型提供一些概论性质的东西&#xff0c;转发出来自娱自乐。期望了解p文件加密的复杂度&#xff0c;而不是一定要尝试挑战加密算法。 但根据大语言模型提供的材料&#…

双轮驱动能源革命:能源互联网与分布式能源赋能工厂能效跃迁

在全球能源结构深度转型与“双碳”目标的双重驱动下&#xff0c;工厂作为能源消耗的主力军&#xff0c;正站在节能变革的关键节点。能源互联网与分布式能源技术的融合发展&#xff0c;为工厂节能开辟了全新路径。塔能科技凭借前沿技术与创新实践&#xff0c;深度探索能源协同优…

React 更新 state 中的数组

更新 state 中的数组 数组是另外一种可以存储在 state 中的 JavaScript 对象&#xff0c;它虽然是可变的&#xff0c;但是却应该被视为不可变。同对象一样&#xff0c;当你想要更新存储于 state 中的数组时&#xff0c;你需要创建一个新的数组&#xff08;或者创建一份已有数组…

ubantu18.04HDFS编程实践(Hadoop3.1.3)

说明&#xff1a;本文图片较多&#xff0c;耐心等待加载。&#xff08;建议用电脑&#xff09; 注意所有打开的文件都要记得保存。 第一步&#xff1a;准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的&#xff0c;因此需要读者完成我之前教程的所有操作。 第二步&am…

MySQL快速入门篇---库的操作

目录 一、创建数据库 1.语法 2.示例 二、查看数据库 1.语法 三、字符集编码和校验&#xff08;排序&#xff09;规则 1.查看数据库支持的字符集编码 2.查看数据库支持的排序规则 3.查看系统默认字符集和排序规则 3.1.查看系统默认字符集 3.2.查看系统默认排序规则 ​…

【已更新完毕】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题

完整内容请看文末最后的推广群 构建校园共享单车的调度与维护问题 摘要 共享单车作为一种便捷、环保的短途出行工具&#xff0c;近年来在高校校园内得到了广泛应用。然而&#xff0c;共享单车的运营也面临一些挑战。某高校引入共享单车后&#xff0c;委托学生对运营情况进行调…

NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)

一个具有n个顶点的连通图&#xff0c;其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说&#xff0c;若砍去⼀条边就会使图不连通图&#xff1b;若增加⼀条边就会形成回路。 ⼀个图的⽣成树可能有多个&#xff0c;将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树…

第十四节:实战场景-何实现全局状态管理?

React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案&#xff08;轻量级首选&#xff09; // 创建全局 Context 对象 const GlobalContext createConte…

数据驱动、精准协同:高端装备制造业三位一体生产管控体系构建

开篇引入 鉴于集团全面推行生产运营体建设以及对二级单位生产过程管控力度逐步加强&#xff0c;某高端装备制造企业生产部长王总正在开展新的一年企业生产管控规划工作&#xff0c;为了能够更好地进行体系规划与建设应用&#xff0c;特邀请智能制造专家小智来进行讨论交流。 王…

航电系统之通信技术篇

航电系统&#xff08;航空电子系统&#xff09;的通信技术是现代航空器的核心技术之一&#xff0c;其核心目标是实现飞行器内部各系统之间以及飞行器与外部设备&#xff08;如地面控制中心、其他飞行器等&#xff09;之间高效、可靠的信息交互。随着航空技术的不断发展&#xf…

发现“横”字手写有难度,对比两个“横”字

我发现手写体“横”字“好看”程度&#xff0c;难以比得上印刷体&#xff1a; 两个从方正简体启体来的“横”字&#xff1a; 哪个更好看&#xff1f;我是倾向于左边一点。 <div style"transform: rotate(180deg); display: inline-block;"> 左边是我从方正简…

深度学习3.1 线性回归

3.1.1 线性回归的基本概念 损失函数 梯度下降 3.1.2 向量化加速 %matplotlib inline import math import time import numpy as np import torch from d2l import torch as d2ln 1000000 #本机为了差距明显&#xff0c;选择数据较大&#xff0c;运行时间较长&#xff0c;可选…

番外篇 | SEAM-YOLO:引入SEAM系列注意力机制,提升遮挡小目标的检测性能

前言:Hello大家好,我是小哥谈。SEAM(Squeeze-and-Excitation Attention Module)系列注意力机制是一种高效的特征增强方法,特别适合处理遮挡和小目标检测问题。该机制通过建模通道间关系来自适应地重新校准通道特征响应。在遮挡小目标检测中的应用优势包括:1)通道注意力增强…

SpringBoot ApplicationEvent:事件发布与监听机制

文章目录 引言一、事件机制的基本概念二、创建自定义事件2.1 定义事件类2.2 发布事件2.3 简化的事件发布 三、创建事件监听器3.1 使用EventListener注解3.2 实现ApplicationListener接口3.3 监听非ApplicationEvent类型的事件 四、事件监听的高级特性4.1 条件事件监听4.2 异步事…