Python的round与Excel的round不一样?

Python四舍五入怎么做

  • round()
    • 奇进偶舍
    • round函数既不是“四舍五入”的原则,也不是“四舍六入无成双”的原则。
  • decimal

round()

偶然发现python的round函数和excel的round函数对某些数据的处理结果不一致。有看到博主提到是奇进偶舍的方法,但经过验证和资料查找发现也不是这样,具体是如何处理的我们一起来看看吧!

奇进偶舍

奇进偶舍:又称为四舍六入五成双规则、银行进位法(Banker's Rounding),是一种计数保留法,是一种数值修约规则。从统计学的角度,“奇进偶舍”比“四舍五入”更为精确:在大量运算时,因为舍入后的结果有的变大,有的变小,更使舍入后的结果误差均值趋于零。而不是像四舍五入那样逢五就进位,导致结果偏向大数,使得误差产生积累进而产生系统误差。“奇进偶舍”使测量结果受到舍入误差的影响降到最低。

其具体要求举例如下(以保留两位小数为例):

  1. 要求保留位数的后一位如果是4,则舍去。例如5.214保留两位小数为5.21。
  2. 如果保留位数的后一位如果是6,则进上去。例如5.216保留两位小数为5.22。
  3. 如果保留位数的后一位如果是5,而且5后面不再有数,要根据应看尾数“5”的前一位决定是舍去还是进入: 如果是奇数则进入,如果是偶数则舍去。例如5.215保留两位小数为5.22; 5.225保留两位小数为5.22。
  4. 如果保留位数的后一位如果是5,而且5后面仍有数。例如5.2254保留两位小数为5.23,也就是说如果5后面还有数据,则无论奇偶都要进入

来源: 百度百科-奇进偶舍
在这里插入图片描述

round函数既不是“四舍五入”的原则,也不是“四舍六入无成双”的原则。

参考: Python四舍五入与保留小数

参考: python精确地进行浮点数的四舍五入

使用下面数据进行验证,发现round也不复合奇进偶舍的方式:
如round(5.215,2)是保留两位小数,而原数据第3位是5,且后面没有有效数字,第2位是1,为奇数,按照“奇进偶舍”的原则,结果应该是5.22,但是实际却是输出5.21;
再比如round(5.675,2)是保留两位小数,而原数据第3位是5,且后面没有有效数字,第2位是7,为奇数,按照“奇进偶舍”的原则,结果应该是5.68,但是实际却是输出5.67;
再比如round(5.275,2),和round(2.675,2)相比小数点后第2位没有改变,仅改变了小数点后第1位,第2位仍为奇数,但是这里保留两位小数的结果却有了进位。
在这里插入图片描述
round函数具体的取值方式,可以查看round函数的官方说明文档: Python3 内置函数
在这里插入图片描述
浮点算术的讲解也可以看一下,其中讲到0.1+0.1+0.1不等于0.3的解释也很有趣: 浮点算术:争议和限制

结论:除非对精确度没什么要求,否则尽量避开用round()函数。如果对精度有要求,最好使用decimal模块。

当然,我们也可以自己定义函数实现四舍五入:

def custom_round(number, decimal_places=0):
    power_of_10 = 10 ** decimal_places
    rounded_number = int(number * power_of_10 + 0.5) / power_of_10
    return rounded_number
custom_round(5.215,2)

# 5.22

decimal

直接使用 decimal 结果是奇进偶舍(具体原因看参考文章):

from decimal import *

a1 = Decimal('5.215').quantize(Decimal('0.00'))
a2 = Decimal('5.225').quantize(Decimal('0.00'))
a3 = Decimal('5.245').quantize(Decimal('0.00'))
a4 = Decimal('5.275').quantize(Decimal('0.00'))
a5 = Decimal('5.285').quantize(Decimal('0.00'))
print(a1, a2, a3, a4, a5)

#5.22 5.22 5.24 5.28 5.28

加上参数 rounding=ROUND_HALF_UP ,就能实现普通的四舍五入啦:

from decimal import *
a1 = Decimal('1.125').quantize(Decimal('0.00'),rounding=ROUND_HALF_UP) #rounding=ROUND_HALF_UP 可以理解为到半向上取整。
a1
# Decimal('1.13')

参考: python 如何四舍五入

不过在传入参数为浮点数的时候,又会出现不一样的结果:
在这里插入图片描述

from decimal import *
a1 = Decimal('11.245').quantize(Decimal('0.00'),rounding=ROUND_HALF_UP)
a1
# Decimal('11.25')

a2 = Decimal(11.245).quantize(Decimal('0.00'),rounding=ROUND_HALF_UP) #rounding=ROUND_HALF_UP 可以理解为到半向上取整。
a2

# Decimal('11.24')

这是因为如果你传入的参数为浮点数,并且这个浮点值在计算机里面不能被精确存储,那么它会先被转换为一个不精确的二进制值,然后再把这个不精确的二进制值转换为等效的十进制值。
所以,建议给Decimal的第一个参数传入字符串型的浮点数,而不是直接写浮点数。

具体参考: 为什么你需要少看垃圾博客以及如何在Python里精确地四舍五入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/563775.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深度学习与神经网络入门

前言 人工智能(AI)与机器学习(ML)与深度学习(DL)的关系: DL包含于ML,ML包含于AI。 即深度学习是机器学习一部分,机器学习又是人工智能的一个分支。 那么深度学习到底有…

关系型数据库的相关概念

表、记录、字段 表 一个实体集相当于一个表记录 一个实体相当于一个记录,在表中表表现为一行数据字段 一个字段相当于数据库表中的列 表的关联关系 一对一(一对一的表可以合并成一张表)一对多多对多 必须创建第三张表,该表通常称为联接表&#xff0c…

协议的定制之序列化与反序列化 | 守护进程

目录 一、再谈协议 二、序列化与反序列化 三、网络计算器的简单实现 四、网络计算器完整代码 五、代码改进 六、守护进程 七、Json序列化与反序列化 八、netstat 一、再谈协议 是对数据格式和计算机之间交换数据时必须遵守的规则的正式描述。简单的说了,网络…

java多线程-练习

需求 代码 使用Callable 方便返回执行的结果&#xff1a;每个线程的发送礼物的数量礼物清单&#xff1a;共享资源&#xff0c;方便上锁礼物数量&#xff1a;线程变量&#xff0c;每个线程发送礼物的数量 public class SendGiftThread implements Callable<Integer> {// 共…

通过命令行构建Django应用程序

假设读者安装好Django开发环境后&#xff08;这个环境搭建很容易&#xff0c;大家可以参看随意一个网文&#xff09;&#xff0c;就可以通过命令行构建Django应用程序了。通过命令行构建Django应用程序的关键&#xff0c;是使用一个Django框架自带的管理工具——django-admin.p…

springboot3 集成knife4j

knife4j介绍 Knife4j是一个集Swagger2 和 OpenAPI3为一体的增强解决方案。 springdoc地址&#xff1a;OpenAPI 3 Library for spring-boot Knife4j官网地址&#xff1a;Knife4j 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j 环境介绍 java&#xff1a;17 Spring…

你们项目日志是如何处理的???

ELK日志采集系统 1.什么是ELK ELK 是一套流行的数据搜索、分析和可视化解决方案&#xff0c;由三个开源项目组成&#xff0c;每个项目的首字母合起来形成了“ELK”这一术语&#xff1a; Elasticsearch (ES): Elasticsearch 是一个基于 Apache Lucene 构建的分布式、实时搜索与…

项目开发流程

项目开发流程 &#x1f469;‍&#x1f9b3;项目立项 估计项目的花费&#xff0c;确定大致的所需开发人员数&#xff0c;确定项目是否可行&#xff1b; &#x1f469;‍&#x1f9b0;需求分析 整体过程&#xff1a; 项目背景和目标&#xff0c;即项目的目的是什么 用户需求&…

动态Web项目讲解+Demo

web流程演示 请求路径 请求路径明确要请求的是哪个servlet 请求方式 servlet含有两种请求方式&#xff1a;doGet和doPost doGet&doPost 返回数据就是httpResponse&#xff0c;返回给success 参数 包含在request当中 成功 上述流程任何一步都没出问题&#xff0c;就会…

设计模式之创建型模式---工厂模式

文章目录 工厂模式概述简单工厂简单工厂的代码实现简单工厂的使用简单工厂应用场景 工厂方法工厂方法模式的代码实现工厂方法的使用工厂方法应用场景 抽象工厂抽象工厂模式代码实现抽象工厂的使用方法抽象工厂模式的应用场景 总结 工厂模式概述 工厂模式从名字就能看出&#x…

在【laravel框架】学习中遇到的常见的问题以及解决方法

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

.net core webapi 高颜值的接口管理系统界面取代swagger,更好调试和查看

.net core webapi 高颜值的接口管理系统界面取代swagger&#xff0c;更好调试和查看 安装 dotnet add package IGeekFan.AspNetCore.Knife4jUI --version 0.0.16配置文档&#xff1a; 配置起始页 builder.Services.AddSwaggerGen(c > {// 配置 Swagger 文档相关信息c.Swa…

开源项目实现简单实用的股票回测

1 引言 之前&#xff0c;尝试做股票工具一直想做的大而全&#xff0c;试图抓取长期的各个维度数据&#xff0c;然后统计或者训练模型。想把每个细节做到完美&#xff0c;结果却陷入了细节之中&#xff0c;最后烂尾了。 最近&#xff0c;听到大家分享了一些关于深度学习、时序…

【面试题】MySQL 事务的四大特性说一下?

事务是一个或多个 SQL 语句组成的一个执行单元&#xff0c;这些 SQL 语句要么全部执行成功&#xff0c;要么全部不执行&#xff0c;不会出现部分执行的情况。事务是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。 事务的主要作用是保证数…

Core dump(核心转储)

文章目录 core dump core dump 进程退出时有三种情况正常退出&#xff0c;退出结果不对&#xff0c;异常退出 低7位表示收到信号退出&#xff0c;次低八位代表进程正常退出它的退出码&#xff01;在第八位有一个core dump标志位&#xff0c;这个标志位表示进程收到信号做的动…

Leetcode 28. 找出字符串中第一个匹配项的下标

心路历程&#xff1a; 两个字符串匹配的问题基本都可以用动态规划解决&#xff0c;递推关系就是依次匹配下去 注意的点&#xff1a; 1、注意边界条件是匹配串needle到头&#xff0c;但是haystack不一定需要到头 2、这道题按照从i开始的字符串而不是从i结束的进行DP建模 解法…

vue---计算属性

姓名案例 1.使用插值语法实现 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>姓名案例_插值语法实现</title><!-- 引入Vue --><script type"text/javascript" src"../js/vue.js"&g…

被这批B端界面的颜值给征服了,匍匐拜倒。。

高颜值的 B 端界面对于企业来说具有非常重要的作用&#xff0c;可以帮助企业提升品牌形象、吸引客户、增加用户留存、提升竞争力、提高交易转化率&#xff0c;以及优化用户体验&#xff0c;从而为企业带来更多的商业机会和利益。本期分享一批&#xff0c;都是颜值杠杠的。

制造业信息安全实践——企业信息安全运营规划

前言 制造业作为一个庞大的传统产业&#xff0c;涵盖了汽车、船舶、飞机、家电、新能源等众多领域。当前&#xff0c;无论是国内还是国外的制造业都面临着一个共同的挑战&#xff1a;在计算机和信息时代的背景下&#xff0c;如何跟上IT技术的发展步伐&#xff1f;如何让传统产…

网络协议安全:OSI七层模型分层及作用,数据封装与解封过程,数据传输过程。

「作者简介」&#xff1a;2022年北京冬奥会中国代表队&#xff0c;CSDN Top100&#xff0c;学习更多干货&#xff0c;请关注专栏《网络安全自学教程》 这一章节我们需要知道OSI分哪七层&#xff0c;每层的作用&#xff0c;知道数据在七层模型中是怎样传输的&#xff0c;封包和解…