四舍五入就用round( )?Python四舍五入的正确打开方式!

菜鸟教程中介绍到,round() 函数作用就是,返回浮点数x的四舍五入值。

> round( x [, n] )
1
参数x,n均为数值表达式,返回值为x的四舍五入值。n为保留的小数位数,不加n则只保留x四舍五入后的整数部分。

>>> round(2.3)
2
>>> round(2.45, 1)
2.5
1
2
3
4
特殊情况
上面的结果并没有错误,这里再用2.675测试一下:

>>> round(2.675, 2)
2.67
1
2
显然结果不符合四舍五入的规则。为什么会这样呢?原因是:round()函数只有一个参数,不指定位数的时候,返回一个整数,而且是最靠近的整数,类似于四舍五入,当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的情况时,如果要取舍的位数前的小数是奇数,则直接舍弃,如果是偶数则向上取舍。

这也就解释了上述现象。可这样一来用round()函数取浮点数的四舍五入值不就变得不可靠了嘛?这样的函数设计的意义何在?网上搜了一圈答案,觉得这个说法比较准确:

python3(注意python2 和 3的round()是不一样的,这里仅以python3作说明)中round()对浮点数的取舍遵循的是“四舍六入五平分”,“五平分”就是根据取舍的位数前的小数奇偶性来判断,奇偶平分,符合公平性原则(四舍五入不是公平的),这样一来也就保证了在数据量较大的情况下,筛选数据的真实性。(数学渣,不知道这样理解对否……)

为什么需要平分呢?原因就是部分小数无法用二进制完整表示,如1.15,转为二进制将是很长的一串数字:1.0010011001100110011001100110011001100110011001100110011 这可不是简单的几个字节就能存放下的。因此这里就出现了取舍的问题。

那么正确的四舍五入是否无法实现了呢?当然是有解决办法的。比如,当你需要四舍五入保留两位小数的时候,可以将数值乘以100再除以100.0:

>>> round(2.675 * 100)/100.0
2.68
1
2
这样可以解决部分浮点数四舍五入的问题。为什么是部分呢?笔者发现:

>>> round(2.135*100)/100.0
2.13
1
2

检验下过程:

>>> 2.135*100
213.49999999999997
1
2
WTF!是精度问题嘛!

>>> Decimal(2.135)*100
Decimal(‘213.4999999999999786837179272‘)
1
2

无法理解是不是!!二进制的世界正常人真的不懂,盼望一下未来有可以直接计算十进制的硬件诞生吧。

总结
在用round()函数进行四舍五入时,如果你对结果有十足把握,并且这就是你想要的结果,那就放心大胆地使用。不然就老老实实写个函数来实现吧,这不是什么难事。
————————————————
版权声明:本文为CSDN博主「流泪熊猫头」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39234705/article/details/82817703

原文地址:https://www.cnblogs.com/hancece/p/11487915.html

时间: 2024-10-16 18:44:45

四舍五入就用round( )?Python四舍五入的正确打开方式!的相关文章

关于格子之表白的正确打开方式

飞碟说69期:<表白的正确打开方式>优酷视频在线观看.你可能想不通, 我身高177.体重117.长相不错.家庭不错.成绩好.体育好.器大活还好,为啥她不喜欢我?飞碟君教你三招: 知己知彼才好下套.自恋和自卑是表白大忌.再牛的技术也比不上真情流露 .自古表白多白表,要经历多少次“十动然拒”,才能学会表白的正确打开方式? 飞碟说谈恋爱系列: 表白的正确打开方式 文字版台词 闽江学院男生赖国森向他心仪的蕾蕾,送出了一封212天写的16万字的情书,内容是回忆两人一起吃过的沙县,他将其装订成册,并取名&

Xcode 的正确打开方式——Debugging(转载)

Xcode 的正确打开方式——Debugging 程序员日常开发中有大量时间都会花费在 debug 上,从事 iOS 开发不可避免地需要使用 Xcode.这篇博客就主要介绍了 Xcode 中几种能够大幅提升代码调试效率的方式. “If debugging is the process of removing bugs, then programming must be the process of putting them in.”——Edsger W. Dijkstra 添加条件 有时候我们可

swf文件的正确打开方式

软件下载链接在此,可不必看下面的解释 最近在看新东方的英语口语视频教程(<新东方4+1英语口语教程>,也在此向大家推荐一下),可是在播放过程中,老是出现自己跳转到视频的起始位置并暂停的状况,很让人抓狂,我试了好几款视频播放器,结果都是一样.想着可能是视频文件的问题吧,也就没管它了,迁就着看了几集. 可是,第二天我贼心不死,百度之.在筛掉几个错误答案之后,发现了这款ZzFlash播放器,下载试了下,视频果然不跳了. 原来视频跳转的原因是:课程设定有跟读的内容环节,一般的视频播放器没有识别出这个东

【分享】WeX5的正确打开方式(7)——数据组件详解

本文是[WeX5的正确打开方式]系列的第7篇文章,详细介绍WeX5中数据组件的增删改查以及数据定位方法. 前言 上一篇 数据组件初探 我们简单介绍了数据组件的引入和底层结构以及特性,并实现了简单的数据展示和数据改动.上一篇中简单提到了,数据组件就是后台数据库表在前端的一个映射,前后端开发人员只要预定好数据组件的内容,就可以简单实现前后端开发的分离.既然数据组件是一个数据库表的映射,那它的基本结构就是一张 2 维表格,举个栗子,定义一个 html5开发工具 的数据组件,xid 为 devtool

转载:淘宝前端团队的干货《论版本号的正确打开方式》

引用原文评论的一句话:条理清晰, 如此甚叼! 论版本号的正确打开方式 作者: 法海 发表于: 2016-08-04 版本号广泛运用于开发的各种场景:NPM 包的版本定义.对 NPM 包的特定版本的依赖指定.git 的 daily 版本号分支…… 面对如此多的场景,版本号的命名却存在很大问题.举些例子: 开始写一个新项目 / 模块时,不管三七二十一,都从 0.0.1 起版本,直到项目不再维护时,版本还停留在 0.0.48,前两位永远都是 0. API 变化巨大,而版本号雷打不动一步一个脚印.一个二

任务队列和异步接口的正确打开方式(.NET Core版本)

任务队列和异步接口的正确打开方式 什么是异步接口? Asynchronous Operations Certain types of operations might require processing of the request in an asynchronous manner (e.g. validating a bank account, processing an image, etc.) in order to avoid long delays on the client si

区块链技术是版权保护的“正确打开方式”

21世纪是互联网的时代,也是知识经济时代.在互联网发展成熟的现阶段,网络成为了众人获取信息.知识.消遣的主要渠道.越来越多的人开始进入新媒体,网络的创作者人数也日益增加,同时网络上也带来了大量的网络版权问题.今天墨者安全就给大家说一下版权保护方面的事情. 为什么说区块链技术是版权保护的正确打开方式呢? 首先是因为区块链独有的特性,有着去中心化.高安全性.不可篡改.公开透明的特性.通过区块链技术可以完整的记录作品和创作者的详细信息,并全部公开:所有的节点都可以共同记录,共同维护:并且盖上不可篡改的

【Android开发笔记】返回到上一个Activity的正确打开方式

技术支持 http://stackoverflow.com/questions/12276027/how-can-i-return-to-a-parent-activity-correctly 首先,在网上看到有人这么写: 1 @Override 2 public boolean onOptionsItemSelected(MenuItem item) { 3 switch (item.getItemId()) { 4 case android.R.id.home: 5 this.getActi

Java循环删除集合多个元素的正确打开方式

首先说下不正确的打开方式: 第一:使用for循环删除集合的元素,示例代码如下 1 ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); 2 for (int i = 0; i < list.size(); i++) { 3 list.remove(i); 4 } 5 System.out