Python 中关于 round 函数的小坑

round函数很简单,对浮点数进行近似取值,保留几位小数。比如:

>>> round(10.0/3, 2)
3.33
>>> round(20/7)
3

第一个参数是一个浮点数,第二个参数是保留的小数位数,可选,如果不写的话默认保留到整数。
这么简单的函数,能有什么坑呢?round的结果跟python版本有关

我们来看看python2和python3中有什么不同:

$ python
Python 2.7.8 (default, Jun 18 2015, 18:54:19) 
[GCC 4.9.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> round(0.5)
1.0
$ python3
Python 3.4.3 (default, Oct 14 2015, 20:28:29) 
[GCC 4.8.4] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> round(0.5)
0

好玩吗?如果我们阅读一下python的文档,里面是这么写的:

在python2.7的doc中,round()的最后写着,“Values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done away from 0.” 保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一样远,则保留到离0远的一边。所以round(0.5)会近似到1,而round(-0.5)会近似到-1。

但是到了python3.5的doc中,文档变成了"values are rounded to the closest multiple of 10 to the power minus ndigits; if two multiples are equally close, rounding is done toward the even choice." 如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。

所以如果有项目是从py2迁移到py3的,可要注意一下round的地方(当然,还要注意/和//,还有print,还有一些比较另类的库)。

>>> round(2.675, 2)
2.67

python2和python3的doc中都举了个相同的例子,原文是这么说的:

Note

The behavior of round() for floats can be surprising: for example, round(2.675, 2) gives 2.67 instead of the expected 2.68. This is not a bug: it’s a result of the fact that most decimal fractions can’t be represented exactly as a float. See Floating Point Arithmetic: Issues and Limitations for more information.

简单的说就是,round(2.675, 2) 的结果,不论我们从python2还是3来看,结果都应该是2.68的,结果它偏偏是2.67,为什么?这跟浮点数的精度有关。我们知道在机器中浮点数不一定能精确表达,因为换算成一串1和0后可能是无限位数的,机器已经做出了截断处理。那么在机器中保存的2.675这个数字就比实际数字要小那么一点点。这一点点就导致了它离2.67要更近一点点,所以保留两位小数时就近似到了2.67。

以上。除非对精确度没什么要求,否则尽量避开用round()函数。近似计算我们还有其他的选择:

  • 使用math模块中的一些函数,比如math.ceiling(天花板除法)。
  • python自带整除,python2中是/,3中是//,还有div函数。
  • 字符串格式化可以做截断使用,例如 “%.2f” % value(保留两位小数并变成字符串……如果还想用浮点数请披上float()的外衣)。
  • 当然,对浮点数精度要求如果很高的话,请用嘚瑟馍,不对不对,请用decimal模块。

来源地址:http://www.cnblogs.com/anpengapple/p/6507271.html

<think>好的,用户想了解小白如何学好Python。首先,我需要考虑用户可能的背景,应该是没有编程经验的新手,所以要从最基础的部分开始讲起。用户可能对学习路径、资源选择、实践方法有疑问。 接下来,我得分解学习步骤。通常学习Python的第一步是安装环境和基础语法,比如变量、数据类型、条件语句、循环、函数这些。要强调动手实践的重要性,可能推荐一些在线编译器或本地安装的简易方法,比如使用Anaconda或者Thonny这样的IDE,避免复杂的配置。 然后,用户可能需要知道如何巩固基础。项目实践是关键,但作为小白,应该从小项目开始,比如计算器、猜数字游戏,这样能应用所学的基础知识。同时,推荐一些练习平台,如LeetCode的简单题目,或者Codewars,帮助积累经验。 接下来是进阶部分,包括面向对象编程、模块和库的使用,比如requests、pandas等。这里需要提到实际应用场景,比如数据分析、网络爬虫,让用户明白学这些有什么用。同时,学习第三方库的安装和使用方法,比如pip的基本命令。 然后是方向选择,用户可能还不清楚学Python用来做什么,所以需要列举常见的方向,比如Web开发、数据分析、自动化等,并给出每个方向需要掌握的库或框架,比如Django、Flask、NumPy、Pandas,以及可能的深入学习资源,比如文档或教程。 资源推荐部分,书籍方面可能需要选择适合新手的,比如《Python编程:从入门到实践》,在线课程如Coursera的Python专项课程,社区推荐如Stack Overflow和GitHub,这些地方可以解决问题和参与项目。 学习建议方面,强调坚持和代码规范的重要性,比如PEP8,还有参与开源项目或自己做一些实际应用,比如自动化处理Excel,这样能保持学习动力。同时,遇到问题如何解决,比如查文档、搜索引擎、提问等。 最后,总结学习路径,鼓励用户持续练习,并提醒不要停留在理论,多动手。可能需要检查是否有遗漏的部分,比如环境搭建的细节,或者常见错误处理,但考虑到用户是小白,避免信息过载,保持建议简洁实用。</think>以下是为零基础小白整理的Python学习路线,按照循序渐进的原则设计,建议收藏后逐步实践: 一、搭建开发环境(1小时) 1. 安装Python(官网下载3.x版本) 2. 推荐IDE:VS Code(轻量级)或PyCharm社区版(功能全) 3. 验证安装:在终端输入 `python --version` 显示版本号即成功 二、掌握基础语法(2-4周) ```python # 示例:综合运用基础语法的计算器 def calculate(a, b, operator): if operator == '+': return a + b elif operator == '-': return a - b elif operator == '*': return a * b elif operator == '/': return round(a / b, 2) if b != 0 else "除数不能为0" else: return "无效运算符" print(calculate(5, 3, '+')) # 输出8 ``` 三、必学核心知识模块 1. 数据结构(列表/字典/集合/元组) 2. 文件操作(txt/csv/json读写) 3. 异常处理(try-except结构) 4. 面向对象编程(类与对象) 5. 常用内置模块(os, datetime, random) 四、项目驱动学习(选择1-2个实战) ```python # 示例:自动天气查询工具 import requests def get_weather(city): api_key = "YOUR_API_KEY" url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}" response = requests.get(url) data = response.json() temp = round(data['main']['temp'] - 273.15, 1) return f"{city}当前温度:{temp}℃" print(get_weather("Beijing")) ``` 五、学习资源推荐 1. 入门书籍:《Python编程:从入门到实践》 2. 免费教程:菜鸟教程Python3(带在线编辑器) 3. 练习平台:牛客网Python题库(按难度分级) 4. 实战项目:GitHub搜索「python beginner projects」 六、进阶路线选择 ┌─────────────┬─────────────┬─────────────┐ │ Web开发 │ 数据分析 │ 自动化 │ ├─────────────┼─────────────┼─────────────┤ │ Flask框架 │ Pandas库 │ Selenium │ │ Django框架 │ NumPy库 │ PyAutoGUI │ │ 前端基础 │ Matplotlib │ 定时任务 │ └─────────────┴─────────────┴─────────────┘ 七、避坑指南 1. 不要死记语法,理解原理更重要 2. 遇到报错先看错误提示最后一行 3. 每学完一个知识点立即写代码验证 4. 善用print()调试和type()查看类型 坚持每天编码1小时,3个月后可以尝试: ✓ 用Python处理Excel报表 ✓ 开发简单的网页爬虫 ✓ 制作数据可视化图表 ✓ 编写自动化办公脚本 记住:编程就像学游泳,站在岸边看再久也不如下水实践!开始写你的第一行代码吧!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值