Python 浮点数运算之谜:深入解析round(0.675, 2)等输出异常
一、问题背景:当浮点数运算遇见 “反直觉” 结果
在 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.67 | 0.68 | 存储值略大于 0.675,触发五入规则 |
0.1 + 0.2 | 0.3 | 0.30000000000000004 | 二进制无法精确表示十进制小数 |
round(2.675, 2) | 0.68 | 2.67 | 存储值略小于 2.675,触发四舍规则 |
1/3 | 0.333... | 0.3333333333333333 | 无限循环小数的浮点数近似存储 |
2 + 1/3 | 2.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 |
五、总结
- 存储本质:浮点数是十进制小数的二进制近似值,必然存在精度损失;
- 舍入规则:
round()的 “银行家舍入法” 仅在末位为 5 且无后续数字时生效,否则按近似值四舍五入; - 工程实践:精确场景用
decimal,普通场景接受误差并做好边界判断。
理解浮点数运算的底层逻辑,才能在编程中避免 “玄学” 问题。
觉得内容有帮助?点赞收藏关注,获取更多 Python 进阶干货~
相关文章:
Python 浮点数运算之谜:深入解析round(0.675, 2)等输出异常
一、问题背景:当浮点数运算遇见 “反直觉” 结果 在 Python 开发中,以下代码输出常让开发者困惑: print(round(0.675, 2)) # 预期0.67,实际0.68||预期0.68,实际0.67 print(0.1 0.2) # 预期0.3&…...
【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8
🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…...
极狐GitLab 注册限制如何设置?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 注册限制 (BASIC SELF) 您可以对注册实施以下限制: 禁用新注册。新注册需要管理员批准。需要用户电子邮件确认。…...
利用大模型实现地理领域文档中英文自动化翻译
一、 背景描述 在跨国性企业日常经营过程中,经常会遇到专业性较强的文档翻译的需求,例如法律文书、商务合同、技术文档等;以往遇到此类场景,企业内部往往需要指派专人投入数小时甚至数天来整理和翻译,效率低下&#x…...
SGFormer:卫星-地面融合 3D 语义场景补全
论文介绍 题目:SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议:IEEE / CVF Computer Vision and Pattern Recognition Conference 论文:https://www.arxiv.org/abs/2503.16825 代码:https://githu…...
Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化
一、软件介绍 文末提供源码和程序下载学习 Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化。Trinity 提供性能分析和 XAI 工具,非常适合深度学习系统或其他执行复杂分类或解码的模型。 二、软件作用和特征 Trinity 通过结合具有超维感知能力的不同交…...
城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色介绍 城市街拍暗色电影胶片风格 Lr 调色,是借助 Adobe Lightroom 软件,为城市街拍的人像或场景照片赋予独特视觉风格的后期处理方式。旨在模拟电影胶片质感,营造出充满故事感与艺术感的暗色氛围,让照片仿佛截取于某部充满张力…...
【家政平台开发(55)】家政平台数据生命线:备份与恢复策略全解析
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
加密和解密(大语言模型)
看到很多对matlab的p文件加密方案感兴趣的。网络上技术资料比较少,所以,我让大语言模型提供一些概论性质的东西,转发出来自娱自乐。期望了解p文件加密的复杂度,而不是一定要尝试挑战加密算法。 但根据大语言模型提供的材料&#…...
双轮驱动能源革命:能源互联网与分布式能源赋能工厂能效跃迁
在全球能源结构深度转型与“双碳”目标的双重驱动下,工厂作为能源消耗的主力军,正站在节能变革的关键节点。能源互联网与分布式能源技术的融合发展,为工厂节能开辟了全新路径。塔能科技凭借前沿技术与创新实践,深度探索能源协同优…...
React 更新 state 中的数组
更新 state 中的数组 数组是另外一种可以存储在 state 中的 JavaScript 对象,它虽然是可变的,但是却应该被视为不可变。同对象一样,当你想要更新存储于 state 中的数组时,你需要创建一个新的数组(或者创建一份已有数组…...
ubantu18.04HDFS编程实践(Hadoop3.1.3)
说明:本文图片较多,耐心等待加载。(建议用电脑) 注意所有打开的文件都要记得保存。 第一步:准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的,因此需要读者完成我之前教程的所有操作。 第二步&am…...
Spring Boot资源耗尽问题排查与优化
Spring Boot服务运行一段时间后新请求无法处理的问题。服务没有挂掉,也没有异常日志。思考可能是一些资源耗尽或阻塞的问题。 思考分析 首先,资源耗尽可能涉及线程池、数据库连接、内存、文件句柄或网络连接等。常见的如线程池配置不当,导致…...
优化WAV音频文件
优化 WAV 音频文件通常涉及 减小文件体积、提升音质 或 适配特定用途(如流媒体、广播等)。以下是分场景的优化方法,涵盖工具和操作步骤: 一、减小文件体积(无损/有损压缩) 1. 无损压缩 转换格式࿱…...
string函数具体事例
输出所有字串出现的位置 输入两个字符串A和B,输出B在A中出现的位置 输入 两行 第一行是一个含有空格的字符串 第二行是要查询的字串 输出 字串的位置 样例输入 I love c c python 样例输出 -1 样例输入 I love c c c 样例输出 8 12 #include<iostream> #inclu…...
8.Rust+Axum 数据库集成实战:从 ORM 选型到用户管理系统开发
摘要 深入探讨 RustAxum 数据库集成,包括 ORM 选型及实践,助力用户管理系统开发。 一、引言 在现代 Web 应用开发中,数据库集成是至关重要的一环。Rust 凭借其高性能、内存安全等特性,与 Axum 这个轻量级且高效的 Web 框架结合…...
电脑 BIOS 操作指南(Computer BIOS Operation Guide)
电脑 BIOS 操作指南 电脑的BIOS界面(应为“BIOS”)是一个固件界面,允许用户配置电脑的硬件设置。 进入BIOS后,你可以进行多种设置,具体包括: 1.启动配置 启动顺序:设置从哪个设备启动&#x…...
MySQL快速入门篇---库的操作
目录 一、创建数据库 1.语法 2.示例 二、查看数据库 1.语法 三、字符集编码和校验(排序)规则 1.查看数据库支持的字符集编码 2.查看数据库支持的排序规则 3.查看系统默认字符集和排序规则 3.1.查看系统默认字符集 3.2.查看系统默认排序规则 …...
前端:uniapp中uni.pageScrollTo方法与元素的overflow-y:auto之间的关联
在uniapp中,uni.pageScrollTo方法与元素的overflow-y:auto属性之间存在以下关联和差异: 一、功能定位差异 uni.pageScrollTo 属于页面级滚动控制,作用于整个页面容器34。要求页面内容高度必须超过屏幕高度,且由根元素下…...
【已更新完毕】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题
完整内容请看文末最后的推广群 构建校园共享单车的调度与维护问题 摘要 共享单车作为一种便捷、环保的短途出行工具,近年来在高校校园内得到了广泛应用。然而,共享单车的运营也面临一些挑战。某高校引入共享单车后,委托学生对运营情况进行调…...
NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)
一个具有n个顶点的连通图,其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说,若砍去⼀条边就会使图不连通图;若增加⼀条边就会形成回路。 ⼀个图的⽣成树可能有多个,将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树…...
第十四节:实战场景-何实现全局状态管理?
React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案(轻量级首选) // 创建全局 Context 对象 const GlobalContext createConte…...
数据驱动、精准协同:高端装备制造业三位一体生产管控体系构建
开篇引入 鉴于集团全面推行生产运营体建设以及对二级单位生产过程管控力度逐步加强,某高端装备制造企业生产部长王总正在开展新的一年企业生产管控规划工作,为了能够更好地进行体系规划与建设应用,特邀请智能制造专家小智来进行讨论交流。 王…...
航电系统之通信技术篇
航电系统(航空电子系统)的通信技术是现代航空器的核心技术之一,其核心目标是实现飞行器内部各系统之间以及飞行器与外部设备(如地面控制中心、其他飞行器等)之间高效、可靠的信息交互。随着航空技术的不断发展…...
Linux 日常运维命令大全
Linux 作为一种开源操作系统,在服务器运维中扮演着重要角色。掌握常用的 Linux 命令对于运维人员而言至关重要。本文将整理一份 Linux 服务器运维常用命令大全,帮助你在日常工作中提高效率和准确性。 1. 基础命令 基础命令是Linux操作的起点࿰…...
HTTP 3.0 协议的特点
HTTP/3 是互联网传输协议的一次重要升级,相较于 HTTP/2,它引入了多项显著改进和新特性。 基于 QUIC 协议: HTTP/3 采用了 QUIC(Quick UDP Internet Connections)作为底层传输协议,QUIC 基于 UDP࿰…...
[工具]Java xml 转 Json
[工具]Java xml 转 Json 依赖 <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all --> <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.37</version> </dependen…...
「仓颉编程语言」Demo
仓颉编程语言」Demo python 1)# 仓颉语言写字楼管理系统示例(虚构语法)# 语法规则:中文关键词 类Python逻辑定义 写字楼管理系统属性:租户库 列表.新建()报修队列 列表.新建()费用单价 5 # 元/平方米方法 添加租户(名称, 楼层, 面积):…...
发现“横”字手写有难度,对比两个“横”字
我发现手写体“横”字“好看”程度,难以比得上印刷体: 两个从方正简体启体来的“横”字: 哪个更好看?我是倾向于左边一点。 <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 #本机为了差距明显,选择数据较大,运行时间较长,可选…...
