原标题:Python中round函数使用注意事项

使用round函数的时候发现了一个奇怪的现象。一直觉得round函数是一个用于四舍五入的函数,结果却不一定。一般如果觉得奇怪,那就是没弄懂其本质的运作原理,所以深入了解了下round函数。

Python版本问题

Python2和Python3有很多实现细节上的不同,round函数是其中不同之一。在Python3中,round(1.0/2.0)得到的是1,而在Python2中,round(1.0/2.0)得到的是0

貌似Python2之间的不同版本也不同。

Python 2.7:

>>> round(10/3, 2)

3.0

>>> round(0.5)

1.0

>>> round(-0.5)

-1.0

>>> round(1.5)

2.0

Python 2.7中:保留值将保留到离上一位更近的一端(四舍六入),如果距离两端一样远,则保留到离0远的一边。所以round(0.5)会近似到1,而round(-0.5)会近似到-1。

Python 3.6:

>>> round(10/3, 2)

3.33

>>> round(0.5)

0

>>> round(-0.5)

0

>>> round(1.5)

2

>>> round(3.5, 2)

3.5 # 不是3.50

如下图:

Python 3中:如果距离两边一样远,会保留到偶数的一边。比如round(0.5)和round(-0.5)都会保留到0,而round(1.5)会保留到2。

注意上面的对比结果,小数位的位数也有区别的!

计算机表示精度的影响

round函数对于返回的浮点数并不是按照四舍五入的规则来计算,而受收到计算机表示精度的影响。

浮点数的一个普遍问题是它们并不能精确的表示十进制数。 并且,即使是最简单的数学运算也会产生小的误差,比如:

>>> a = 4.2

>>> b = 2.1

>>> a + b

6.300000000000001

>>> a + b == 6.3

False

Python 2.7 和 3.6:

>>> round(1.675, 2)

1.68

>>> round(2.675, 2)

2.67

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

综上,利用round函数来实现四舍五入和小数位保留,结果可能不是预期的,如果对四舍五入和小数位精度要求高,避免使用round函数。较好的解决方案可以使用decimal模块。

>>> from decimal import Decimal

>>> a = Decimal('4.2')

>>> b = Decimal('2.1')

>>> a + b

Decimal('6.3')

>>> a + b == Decimal('6.3')

True

>>> from decimal import Decimal

>>> d = Decimal(2.675) # 如果Decimal参数是浮点数 默认还是会截断

>>> d.quantize(Decimal('0.00'))

Decimal('2.67')

>>> d = Decimal('2.675') # 用字符串就可以做到正常的四舍五入和精确的精度

>>> d.quantize(Decimal('0.00'))

Decimal('2.68')

>>> d = Decimal(3.5)

>>> d.quantize(Decimal('0.00'))

Decimal('3.50')

>>> d = Decimal('3.5')

>>> d.quantize(Decimal('0.00'))

Decimal('3.50')

>>> from decimal import Decimal, ROUND_UP

>>> n = Decimal('0.0000416')

>>> n.quantize(Decimal('0.01'))

Decimal('0.00')

>>> n.quantize(Decimal('0.01'), rounding=ROUND_UP) # 保证最小是0.01

Decimal('0.01')

要处理更精确的分数精度,可以使用fractions模块的Fraction类。

更多Python相关信息见Python 专题页面 https://www.linuxidc.com/topicnews.aspx?tid=17

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

本文永久更新链接地址:https://www.linuxidc.com/Linux/2019-01/156541.htm返回搜狐,查看更多

责任编辑:

python3.6中round函数_Python中round函数使用注意事项相关推荐

  1. python round函数_python中round函数如何使用

    round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10.0/3, 2) 3.33 >>> round(20/7) 3 第一个参数是 ...

  2. python中的json函数_python中装饰器、内置函数、json的详解

    装饰器 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象. 先看简单例子: def run(): time.sleep(1 ...

  3. python nums函数_Python中的内置函数

    Python中有很多内置函数,不需要我们调用模块可以直接使用,而且都是常用函数的封装,下面我们来看看Python中的内置函数都有那些. 1.abs() abs()是绝对值函数,把一个负数转化为正数,数 ...

  4. python函数中的变量_Python中的函数与变量

    本节内容 函数的定义方法 函数功能 函数的返回值 函数的形参与实参 全局变量与局部变量 递归 函数的作用域 匿名函数lambda 函数式编程 常用内置函数 其他内置函数 函数 函数的定义方法 函数就相 ...

  5. python里面map函数_python中的map()函数

    先来看一下官方文档: map(function, iterable, ...) Apply function to every item of iterable and return a list o ...

  6. python中输入数字函数_python中怎么获取输入的数

    python中通过input()函数来获取输入的数.input()函数接收一个标准输入数据,并返回为string类型.函数语法:[input([prompt])],如[age = input(&quo ...

  7. python endswith函数_Python中endswith()函数的使用方法

    Python中提供的内置函数中endswith()是用于判断一个字符串是否以特定的字符串后缀结尾,如果是则返回逻辑值True,否则返回逻辑值False. 该函数与startswith()函数相似,只不 ...

  8. python local函数_python中的函数

    函数 一.函数的定义 def是可执行的代码.def创建了一个对象并将其赋值给某一变量名.def语句是实时执行的,即:def在运行时才进行评估,而在def之中的代码在函数调用后才会评估.函数本身就是一个 ...

  9. python中模块和函数_Python中函数和模块的体验与使用

    函数基础 目标 函数的快速体验 函数的基本使用 函数的参数 函数的返回值 函数的嵌套调用 在模块中定义函数 01. 函数的快速体验 1.1 快速体验 所谓函数,就是把 具有独立功能的代码块 组织为一个 ...

最新文章

  1. PaaS模式创新:实现应用可移植性
  2. 数学基础、机器学习经典算法、统计学习方法,这份机器学习在线手册来帮你...
  3. vue 插入word模板 项目_10 分钟为你的 vue 项目编写代码文档
  4. sd_fusing.sh将uboot烧写到SD卡
  5. 【XML】Java对象数据的XML和JSON表示
  6. 我本人一直以来犯的错误,在看了 Think In Java 后才抓了出来
  7. hdu 1281 棋盘游戏 (二分匹配)
  8. 美国大学计算机学科分类
  9. matlab2c使用c++实现matlab函数系列教程-logspace函数
  10. datetime与timestamp的区别
  11. OPENCV与OPENCL
  12. 定向思维 C# datediff
  13. 英语常用口语1000句
  14. glog使用-查看LOG
  15. java中list删除元素_java中,删除一个List中的后n个元素
  16. 干货 !玩转Linux中的输入输出管理(1)
  17. android培训学习班,常州android培训学习班
  18. nyoj 1248 海岛争霸
  19. 接口测试用例怎么写? 模板示例 2021
  20. MongoDB + PostgreSQL中文社区 南京技术大会

热门文章

  1. 打标激光系统的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  2. 量化投资实战(一)之KDJ交易策略
  3. 批量伪原创工具,支持各种CMS,API接口发布
  4. 极智嘉Geek+再创发展里程碑,或将科创板挂牌上市
  5. 使用网易云信实现的文字图片聊天Demo
  6. Appweb交叉编译
  7. 如何卸载jupyter
  8. Git CMD, Git bash, Git GUI区别
  9. android自定义渐变色圆环,Android实现渐变圆环、圆形进度条效果
  10. Java 爬取BiliBili追番排行榜