Python 中的浮点数比较,以及 decimal 模块

文章探讨了Python中浮点数比较的陷阱,指出使用round()进行圆整的必要性,并介绍了decimal模块用于高精度计算。还提到浮点数的有效位数和x86-64系统的精度限制。
部署运行你感兴趣的模型镜像

结论

先说 2 个结论:

  1. 在 Python 中比较浮点数的大小时,必须先用 round() 进行圆整,再比较大小。否则可能出错。
  2. 如果对精度要求很高,可以使用 decimal 模块。

1. 一个简单示例

理论上,1.1 + 2.2 > 3.3 应该返回布尔值 False,但是实际结果并非如此。如下图所示。
在使用 round 之后可以得到正确的结果。
在这里插入图片描述
出现上图错误的原因,是因为计算机中的小数是不精确的。

2. Python 中的浮点数表达

Python 中的浮点数,实际上是用 2 个整数相除来表达。用 float.as_integer_ratio() 可以查看这 2 个整数。如下图。
在这里插入图片描述
用 float.as_integer_ratio(),可以知道为什么 1.1 + 2.2 会有误差。
在这里插入图片描述

产生上面的情况,是因为计算机本身的特性,即计算机无法精确表达浮点数,只能精确表达整数。简单来说是:
假设一个计算机,只用 2 个 bit 来表示数字,那么它可以表示为 00, 01, 10, 11 ,可以精确表达 [0, 1, 2, 3] 共 4 个整数。但是因为 0 到 3 之间的小数是无穷个(实际上 0 到 1 之间的小数已经是无穷),所以它无法精确地表达小数。
现代计算机很多是 32 位或 64 位,虽然它可以精确地表达更多的整数,但是同样无法表达无穷的小数,因此必然会有误差。

3. 浮点数的有效位数

在使用 round 取整时,需要根据自己的数据情况,来确定对小数点后多少位进行取整。
并且要注意,x86-64 系统的浮点数有 17 位有效数字 significant digits。有效数字从左边第一位非 0 数字开始算起。如下图是在 64 位 Ubuntu 系统下测试的结果。
在这里插入图片描述

4. decimal 模块

如果是对小数点后精度要求很高的场景,可以使用 decimal 模块。如下示例。
这些高精度场景包括财务方面的计算,或是要设计一个计算器程序等场景。
在这里插入图片描述
另外,如果只是要比较 2 个浮点数是否相等,也可以使用 numpy.isclose 函数。

isclose

5. 参考资料

更多关于浮点数的讨论,可以参看 Python 官网:
https://docs.python.org/3/tutorial/floatingpoint.html#

—————— 本文结束 ——————

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

<think>我们正在处理一个关于如何切换到vue-devtools项目的特定标签(tag)或分支的问题。用户已经知道需要切换到v5.1.0 tag或者master分支,但不知道具体如何操作。 步骤: 1. 首先,我们需要确保已经克隆了vue-devtools的仓库到本地。如果没有,需要先克隆。 2. 使用git命令切换到特定的tag分支。 具体操作: ### 1. 克隆仓库(如果尚未克隆) 如果你还没有克隆vue-devtools的仓库,请先执行: ```bash git clone https://github.com/vuejs/vue-devtools.git cd vue-devtools ``` ### 2. 查看可用的标签(tag)和分支 - 查看所有标签: ```bash git tag ``` 这会列出所有可用的标签。我们需要的标签是`v5.1.0`(如果有的话,注意标签命名可能略有不同,比如`v5.1.0`或`5.1.0`,但通常以v开头)。 - 查看所有分支: ```bash git branch -a ``` 这会列出本地和远程的分支。其中,`master`分支是主分支(注意:现在很多项目将默认分支改为`main`,但vue-devtools项目仍然使用`master`)。 ### 3. 切换到标签(tag) 标签是某个特定提交的标记,通常用于版本发布。切换到标签使用以下命令: ```bash git checkout tags/<tag_name> ``` 例如,切换到`v5.1.0`标签: ```bash git checkout tags/v5.1.0 ``` 注意:标签名要严格匹配。如果不确定,可以用`git tag`命令查看。 ### 4. 切换分支branch切换master分支(或其他分支): ```bash git checkout master ``` 或者,如果分支在远程,可能需要先创建本地分支并跟踪远程分支(通常克隆后已经有了远程分支的跟踪,可以直接切换): ```bash git checkout master ``` ### 5. 验证当前所在位置 使用以下命令查看当前所在的分支或标签状态: ```bash git status ``` 它会显示当前处于哪个分支或标签(注意,如果切换到标签,会处于“分离头指针”状态,这是正常的,因为标签指向一个固定的提交)。 ### 注意事项 - 切换分支或标签后,可能需要重新安装依赖(因为不同版本的依赖可能不同): ```bash npm install # 或者使用cnpm ``` 如果npm安装失败,可以尝试使用cnpm(需要先安装cnpm): ```bash cnpm install ``` - 如果之前已经安装过依赖,切换后最好删除`node_modules`目录重新安装,以避免依赖冲突。 ### 引用说明 根据用户提供的参考,切换到特定标签或分支可以解决安装依赖失败的问题[^1]。 §§相关问题§§ 1. 如何在不克隆整个仓库的情况下下载特定标签或分支代码? 2. 切换到标签后如何创建新分支进行修改? 3. 如何解决切换分支或标签后出现的依赖冲突问题? </think>要在 `vue-devtools` 项目中切换到特定的标签(tag)或分支,请按以下步骤操作: ### 1. 克隆项目(若尚未克隆) ```bash git clone https://github.com/vuejs/vue-devtools.git cd vue-devtools ``` ### 2. 查看可用标签和分支 ```bash # 查看所有标签 git tag -l # 查看所有分支 git branch -a ``` ### 3. 切换指定标签或分支 ```bash # 切换到 v5.1.0 标签 git checkout tags/v5.1.0 # 或者切换master 分支 git checkout master ``` ### 4. 验证切换结果 ```bash # 查看当前状态 git status # 确认当前指向的提交ID(标签会显示为 detached HEAD) git log -1 --oneline ``` ### 5. 安装依赖(切换后重要步骤) ```bash # 推荐使用 cnpm 避免网络问题 cnpm install # 或使用 npm(可能需要 sudo 权限) npm install ``` ### 注意事项 1. 标签本质是指向特定提交的静态指针,切换后处于 "detached HEAD" 状态(即不在任何分支上) 2. 若要基于标签修改代码,建议创建新分支: ```bash git checkout -b my-fix tags/v5.1.0 ``` 3. 首次克隆项目后,需获取远程标签信息: ```bash git fetch --tags ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值