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_placesrounded_number = int(number * power_of_10 + 0.5) / power_of_10return 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里精确地四舍五入

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【QT教程】QT6 Quick与QML

QT6Quick与QML 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C扩展开发视频课程 免费QT视频课程 您可以看免费1000个QT技术视频 免费QT视频课程 QT统计图和QT数据可视化视频免费看 免费QT视频课程 QT性能优化视频免费看 免费Q…

49-PCIE转网口电路设计

视频链接 PCIE转网口电路设计01_哔哩哔哩_bilibili PCIe转网口电路设计 1、PCIE转网口电路设计基本介绍 pcie转网口的设计,一般有intel (i350)和网讯(wx1860)两种方案。 2、PCIE转网口的方案 2.1、I350 2.2、WX1860 (网迅) 国产化&#…

linux C -- 消息队列

linux C -- 消息队列 前言一、System V(IPC)消息队列接口调用主要涉及到 msgget、msgsnd、msgrcv 和 msgctl 四个接口: 1、创建消息队列 msgget2、发送消息到队列3、从队列接收信息4、控制消息队列 msgctl5、删除消息队列 二、代码编写1、发送部分的代码2、代码完成…

BYOL(NeurIPS 2020)原理解读

paper:Bootstrap your own latent: A new approach to self-supervised Learning third-party implementation:https://github.com/open-mmlab/mmpretrain/blob/main/mmpretrain/models/selfsup/byol.py 本文的创新点 本文提出了一种新的自监督学习方…

获取会话公钥

----------------------------------------------------举例 签到 接口开始--------------------------------------------------- 第一步:-----请求报文明文:{"body":{},"head":{"ywId":"GY0001"}} ODxdq2/WhHlCKoLIGNV2j…

uniapp picker 多列选择器用法

uniapp picker 多列选择器联动筛选器交互处理方法, uniapp 多列选择器 mode"multiSelector" 数据及筛选联动交互处理, 通过接口获取数据,根据用户选择当前列选项设置子列数据,实现三级联动效果, 本示例中处…

SEW减速机参数查询 2-2 实践

首先说说结论:在不和SEW官方取得沟通之前,你几乎无法直接通过查阅SEW官方文档得到相关减速机的所有技术参数:比如轴的模数和齿数,轴承的参数。我在周一耗费了一个上午,最终和SEW方面确认后才知晓相关技术参数需要凭借销…

Jenkins的安装和部署

文章目录 概述Jenkins部署项目的流程jenkins的安装启动创建容器进入容器浏览器访问8085端口 Jenkins创建项目创建example项目 概述 Jenkins:是一个开源的、提供友好操作界面的持续集成(CLI)工具,主要用于持续、自动构建的一些定时…

什么是Rust语言?探索安全系统编程的未来

🚀 什么是Rust语言?探索安全系统编程的未来 文章目录 🚀 什么是Rust语言?探索安全系统编程的未来摘要引言正文📘 Rust语言简介🌟 发展历程🎯 Rust的技术意义和优势📦 Rust解决的问题…

GlobalRouting - FastRoute代码框架和功能(三)

文章目录 一、 顶层代码框架和功能(一)、总结(二)、各文件代码的概述:1. FastRoute\\src\\Box.h2. FastRoute\\src\\Coordinate.h3. FastRoute\\src\\DBWrapper.h4. FastRoute\\src\\FastRouteKernel.h5. FastRoute\\src\\Grid.h成员变量成员函数 6. FastRoute\\src…

python零基础入门 (9)-- 模块与包

文章目录 前言1. 什么是模块?1.1 模块的定义和作用1.2 内置模块和第三方模块 2. 如何使用模块?2.1 导入模块2.2 使用模块中的函数和变量 3. 什么是包?3.1 包的定义和作用3.2 包的结构和组织方式 4. 如何创建自定义模块?4.1 创建一…

Conmi的正确答案——ESP32获取MAC地址

ESP-IDF版本&#xff1a;v5.2.1 ESP32芯片型号&#xff1a;ESP32C3&#xff08;4M flash版本&#xff09; ESP支持的MAC地址有&#xff1a; typedef enum {ESP_MAC_WIFI_STA, /**< MAC for WiFi Station (6 bytes) */ESP_MAC_WIFI_SOFTAP, /**< MAC for WiFi Sof…

电商技术揭秘三十:知识产权保护浅析

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

REACT+PHP课程项目血泪史

PHP php??老师让用php写后端。什么&#xff1f;写惯了java、python。这个看起来像html标签语言的东西写后端是个什么鬼&#xff0c;看起来想落后几千年的原始语言&#xff08;手动滑稽&#xff09;。 大概介绍一下&#xff0c;php主要是后端语言&#xff0c;用来连接数据库…

Day17-Java基础之综合案例

练习一&#xff1a;飞机票 需求: 机票价格按照淡季旺季、头等舱和经济舱收费、输入机票原价、月份和头等舱或经济舱。 按照如下规则计算机票价格&#xff1a;旺季&#xff08;5-10月&#xff09;头等舱9折&#xff0c;经济舱8.5折&#xff0c;淡季&#xff08;11月到来年4月…

deepinV23 Beta3安装cuda

文章目录 下载CUDA安装,以cuda11.6为例运行.run文件安装选项配置环境变量查看cuda版本重启计算机 卸载cuda deepinV23 Beta3对应的debian版本是12&#xff1a; bookworm指的是debian12&#xff0c; sid代表不稳定版。 下载CUDA 官网&#xff1a;https://developer.nvidia.com…

你为什么会成为一名程序员?

在当今数字化时代&#xff0c;程序员这一职业越来越受到人们的关注和追捧。许多人选择成为一名程序员&#xff0c;不仅是因为这个职业的前景广阔&#xff0c;还因为他们对编程和技术的兴趣。那么&#xff0c;选择成为一名程序员的原因究竟是出于兴趣还是职业发展呢&#xff1f;…

中华环保联合会获得国家“绿色制造体系” 第三方评价机构资格

近日&#xff0c;中华环保联合会成功获得工业和信息化部“绿色制造体系”第三方评价机构资格&#xff0c;可为企业、园区及相关机构提供全面的绿色制造体系评价服务&#xff0c;包括绿色工厂、绿色园区、绿色供应链等方面。 “绿色制造体系建设”是由工业和信息化部负责统筹推进…

Python3中的时间应用 (代码)

直接上python3代码 # 对时间类型的转换 from datetime import datetime import localelocale.setlocale(locale.LC_CTYPE, "chinese")# 字符串 -> datetime类型 text "2024年-4月-1日" res datetime.strptime(text, "%Y年-%m月-%d日") pr…

redis异常:OOM command not allowed when used memory > ‘maxmemory‘

redis存储数据太多,内存溢出,导致异常 1.查看redis内存使用情况 登录redis后 info memory2.查看分配给redis的最大内存 config get maxmemory3.处理方式:拓展redis的最大内存 打开redis.conf文件,修改maxmemory 4.删掉键值重启redis后,发现删掉的数据又恢复了? redis根目录…