当前位置: 首页 > news >正文

python语言之round(num, n)小数四舍五入

文章目录

  • python round(num, n)小数四舍五入
    • python round(num, n)基础
      • 银行家舍入(Banker's Rounding)
      • 利息被银行四舍五入后,你到底是赚了还是亏了?
    • python小数位的使用decimal模块四舍五入(解决round 遇5不进)

python round(num, n)小数四舍五入

python round(num, n)基础

round函数执行的是标准的四舍五入操作。

> round( number [, ndigits]  )
# number:要四舍五入的数,ndigits:要小数点后保留的位数。ndigits为保留的小数位数,不加ndigits则只保留x四舍五入后的整数部分。

round函数的语法结构为:ndigits为小数点后保留的位数、其中number为需要进行四舍五入的数字,round(number,ndigits)。即进行整数舍入、则默认为0,如果ndigits未指定。

然而,对于某些特定的情况,round函数可能会出现不符合预期的行为。

>>> round(2.45, 1)
2.5
>>> round(2.675, 2)
2.67

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

>>> round(3.1456, 2)
3.15
>>> round(3.1415, 2)
3.14

当指定取舍的小数点位数的时候,一般情况也是使用四舍五入的规则,但是碰到.5的情况时,如果要取舍的位数前的小数是奇数,则直接舍弃,如果是偶数则向上取舍

>>> from decimal import Decimal
>>> import decimal
>>> from decimal import Decimal
>>> print(Decimal(2.6750))
2.67499999999999982236431605997495353221893310546875
>>> print(Decimal(2.675))
2.67499999999999982236431605997495353221893310546875
>>> print(Decimal(2.6751))
2.675100000000000033395508580724708735942840576171875

用二进制转化的是有精度损失.部分小数无法完全用二进制表示,round 本身没有问题,而是二进制保存的值有点误差导致的。

银行家舍入(Banker’s Rounding)

银行家舍入法是由IEEE 754标准规定的浮点数取整算法 [1],大部分的编程软件都使用的是这种方法。 所谓银行家舍入法,其实质是一种四舍六入五取偶(又称四舍六入五留双)法。

这不是bug,而是一种常见的舍入法,名称是“银行家式舍入法”,
用意是一半舍一半入,如果碰到0.5全入,那么银行觉得自己亏了,
银行希望和用户要风险对半。不光Python,其他的计算机语言都是这个方法

这一方式的另一个常见名称为“银行家舍入”,是IEEE754标准的推荐舍入标准。这一方式跟通常的四舍五入相比,平均数方面更能保持原有数据的特性。

四舍六入五考虑,五后非空就进一,五后为空看奇偶,五前为偶应舍去,五前为奇要进一。 其实大多数编程语言在浮点数的运算上或者保留小数位上都是使用的银行家舍入法。

利息被银行四舍五入后,你到底是赚了还是亏了?

涨知识丨利息被银行四舍五入后,你到底是赚了还是亏了?
参考URL: https://m.thepaper.cn/baijiahao_8230554

大家在小学就会学四舍五入对吧,四及以下被舍去,五以及更大的数字则进1。

这个在平时做题的时候没有什么问题,毕竟做错做对也不会来钱。那么问题来了,银行交易的最小单位是分,被小数点约掉的钱虽然不多,但是如果按照我们小学的四舍五入,你和银行到底谁亏谁赚呢?

四舍五入其实有不利于银行,而有利于储户。

真正广泛采用银行家舍入法的,是需要更小误差的科学和计算机系统,因此银行家舍入也常常叫做统计学家舍入(statistician’s rounding),无偏舍入(unbiased rounding)

1940年开始,美国材料和试验协会(ASTM)用的就是银行家舍入法。现在大部分编程软件的默认设置都是银行家舍入法,比如C/C++、JavaScript、PHP、Go,英特尔处理器用的也是银行家舍入。

python小数位的使用decimal模块四舍五入(解决round 遇5不进)

decimal模块
在做小数运算或者四舍五入时怎么避免,数据不精确的问题呢?这就要用到Decimal模块。
https://docs.python.org/zh-cn/3/library/decimal.html#rounding-modes

>>> import decimal
>>> from decimal import Decimal
>>> a = "1.345"
>>> a_t = Decimal(a).quantize(Decimal("0.00"), rounding=decimal.ROUND_HALF_UP)
>>> print(a_t)
1.35

四舍五入是基于十进制的,在二进制无法精确表示的时候是会有误差的。
任何需要十进制运算的地方,都需要用 decimal.Decimal 取代 float:

from _pydecimal import Decimal, Context, ROUND_HALF_UP
print(Context(prec=3, rounding=ROUND_HALF_UP).create_decimal('1.325'))
  • ROUND_HALF_UP 我们熟悉的四舍五入
  • ROUND_HALF_EVEN 四舍六入五成双

我们抽象成正常的函数方便使用:

import decimaldef normal_round(n, decimal_places):"""进行正常的四舍五入,并指定保留的小数位数"""context = decimal.getcontext()context.rounding = decimal.ROUND_HALF_UProunded_value = round(decimal.Decimal(n), decimal_places)return rounded_valueoverall_score = 87.565
grade = normal_round(overall_score, 2)
print(grade)

执行结果:

>>> round(87.565, 2)
87.56
>>> import decimal
>>>
>>> def normal_round(n, decimal_places):
...     """进行正常的四舍五入,并指定保留的小数位数"""
...     context = decimal.getcontext()
...     context.rounding = decimal.ROUND_HALF_UP
...     rounded_value = round(decimal.Decimal(n), decimal_places)
...     return rounded_value
...
>>> overall_score = 87.565
>>> grade = normal_round(overall_score, 2)
>>> print(grade)
87.56
>>>

注意:normal_round函数返回的是decimal.Decimal类型的对象,而不是浮点数。
数据库操作可能不支持decimal.Decimal类型的参数。对于这种情况,你可以将normal_round函数返回的结果转换为浮点数或字符串,以适应数据库操作的要求。

import decimaldef normal_round(n, decimal_places):"""进行正常的四舍五入,并指定保留的小数位数"""context = decimal.getcontext()context.rounding = decimal.ROUND_HALF_UProunded_value = round(decimal.Decimal(n), decimal_places)return float(rounded_value)

在这个修改后的函数中,我们使用 float 函数将 rounded_value 转换为浮点数类型。这样,normal_round 函数将返回一个浮点数,而不是 decimal.Decimal 对象。

相关文章:

python语言之round(num, n)小数四舍五入

文章目录 python round(num, n)小数四舍五入python round(num, n)基础银行家舍入(Bankers Rounding)利息被银行四舍五入后,你到底是赚了还是亏了? python小数位的使用decimal模块四舍五入(解决round 遇5不进) python round(num, n…...

安全风险攻击面管理如何提升企业网络弹性?

从研究人员近些年的调查结果来看,威胁攻击者目前非常善于识别和利用最具有成本效益的网络入侵方法,这就凸显出了企业实施资产识别并了解其资产与整个资产相关的安全态势的迫切需要。 目前来看,为了在如此复杂的网络环境中受到最小程度上的网络…...

常用的几款性能测试软件

Apache JMeter是一款免费、开源的性能测试工具,广泛应用于Web应用程序和服务的性能测试。它支持模拟多种不同类型的负载,可以测试应用程序在不同压力下的性能表现,并提供丰富的图表和报告来分析测试结果。 优点: 免费且开源&…...

谷歌google浏览器无法更新Chrome至最新版本怎么办?浏览器Chrome无法更新至最新版本

打开谷歌google浏览器提示:无法更新Chrome,Chrome无法更新至最新版本,因此您未能获得最新的功能和安全修复程序。点击「重新安装Chrome」后无法访问此网站,造成谷歌浏览器每天提示却无法更新Chrome至最新版本。 谷歌google浏览器无…...

认识异常(1)

❤️❤️前言~🥳🎉🎉🎉 hellohello~,大家好💕💕,这里是E绵绵呀✋✋ ,如果觉得这篇文章还不错的话还请点赞❤️❤️收藏💞 💞 关注💥&a…...

C++矩阵

C矩阵【基本】&#xff08;will循环&#xff09; #include<iostream> #include<string.h> using namespace std; int main() {int a[100][100]{0};int k 1;int i 0;int j 0;while(k<100){if(j>10){j0;i;}a[i][j]k;j;k;}i 0;j 0;while(true){if(i 9&am…...

解锁智能未来:用Ollama开启你的本地AI之旅

Ollama是一个用于在本地运行大型语言模型&#xff08;LLM&#xff09;的开源框架。它旨在简化在Docker容器中部署LLM的过程&#xff0c;使得管理和运行这些模型变得更加容易。Ollama提供了类似OpenAI的API接口和聊天界面&#xff0c;可以非常方便地部署最新版本的GPT模型并通过…...

CSS实现卡片在鼠标悬停时突出效果

在CSS中&#xff0c;实现卡片在鼠标悬停时突出&#xff0c;通常使用:hover伪类选择器。 :hover伪类选择器用于指定当鼠标指针悬停在某个元素上时&#xff0c;该元素的状态变化。通过:hover选择器&#xff0c;你可以定义鼠标悬停在元素上时元素的样式&#xff0c;比如改变颜色、…...

GPT建模与预测实战

代码链接见文末 效果图&#xff1a; 1.数据样本生成方法 训练配置参数&#xff1a; --epochs 40 --batch_size 8 --device 0 --train_path data/train.pkl 其中train.pkl是处理后的文件 因此&#xff0c;我们首先需要执行preprocess.py进行预处理操作&#xff0c;配置参数…...

传统方法(OpenCV)_车道线识别

一、思路 基于OpenCV的库&#xff1a;对视频中的车道线进行识别 1、视频处理&#xff1a;视频读取 2、图像转换&#xff1a;图像转换为灰度图 3、噪声去除&#xff1a;高斯模糊对图像进行去噪&#xff0c;提高边缘检测的准确性 4、边缘检测&#xff1a;Canny算法进行边缘检测…...

Git以及Gitlab的快速使用文档

优质博文&#xff1a;IT-BLOG-CN 安装git 【1】Windows为例&#xff0c;去百度下载安装包。或者去官网下载。安装过秳返里略过&#xff0c;一直下一步即可。丌要忉记设置环境发量。 【2】打开cmd&#xff0c;输入git –version正确输出版本后则git安装成功。 配置ssh Git和s…...

MyBatis Interceptor拦截器高级用法

拦截插入操作 场景描述&#xff1a;插入当前数据时&#xff0c;同时复制当前数据插入多行。比如平台权限的用户&#xff0c;可以同时给其他国家级别用户直接插入数据 实现&#xff1a; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.Executor; impor…...

Python学习入门(2)——进阶功能

14. 迭代器和迭代协议 在Python中&#xff0c;迭代器是支持迭代操作的对象&#xff0c;即它们可以一次返回其成员中的一个。任何实现了 __iter__() 和 __next__() 方法的对象都是迭代器。 class Count:def __init__(self, low, high):self.current lowself.high highdef __i…...

华为改进点

华为公司可以在员工福利方面做出改进&#xff0c;提高员工的工作满意度和忠诚度。例如&#xff0c;可以增加员工福利&#xff0c;如提供更多灵活的工作时间、提供更好的培训和发展机会、加大健康保障和福利待遇等。 此外&#xff0c;华为公司也可以加强与客户的沟通与合作&…...

分布式技术---------------消息队列中间件之 Kafka

目录 一、Kafka 概述 1.1为什么需要消息队列&#xff08;MQ&#xff09; 1.2使用消息队列的好处 1.2.1解耦 1.2.2可恢复性 1.2.3缓冲 1.2.4灵活性 & 峰值处理能力 1.2.5异步通信 1.3消息队列的两种模式 1.3.1点对点模式&#xff08;一对一&#xff0c;消费者主动…...

BGP扩展知识总结

一、BGP的宣告问题 在BGP协议中每台运行BGP的设备上&#xff0c;宣告本地直连路由在BGP协议中运行BGP协议的设备&#xff0c;来宣告通过IGP学习到的未运行BGP协议设备产生的路由&#xff1b;&#xff08;常见&#xff09; 在BGP协议中宣告本地路由表中路由条目时&#xff0c;将…...

华为OD-C卷-按身高和体重排队[100分]

题目描述 某学校举行运动会&#xff0c;学生们按编号(1、2、3…n)进行标识&#xff0c;现需要按照身高由低到高排列&#xff0c;对身高相同的人&#xff0c;按体重由轻到重排列&#xff1b;对于身高体重都相同的人&#xff0c;维持原有的编号顺序关系。请输出排列后的学生编号…...

云原生(八)、Kubernetes基础(一)

K8S 基础 # 获取登录令牌 kubectl create token admin --namespace kubernetes-dashboard1、 NameSpace Kubernetes 启动时会创建四个初始名字空间 default:Kubernetes 包含这个名字空间&#xff0c;以便于你无需创建新的名字空间即可开始使用新集群。 kube-node-lease: 该…...

Linux 系统解压缩文件

Linux系统&#xff0c;可以使用unzip命令来解压zip文件 方法如下 1. 打开终端&#xff0c;在命令行中输入以下命令来安装unzip&#xff1a; sudo apt-get install unzip 1 2. 假设你想要将zip文件解压缩到名为"target_dir"的目录中&#xff0c;在终端中切换到目标路…...

linux如何使 CPU使用率保持在指定百分比?

目录 方法1&#xff1a;&#xff08;固定在100%&#xff09; 方法2&#xff1a;&#xff08;可以指定0~100%&#xff09; 方法3&#xff1a;使用ChaosBlade工具&#xff08;0~100%&#xff09; 方法1&#xff1a;&#xff08;固定在100%&#xff09; for i in seq 1 $(cat /pro…...

针对‘全球化域名’策略的 AI 审计:如何利用 AI 自动分配不同语种的抓取权重?

各位来宾&#xff0c;各位技术同仁&#xff0c;大家好&#xff01; 非常荣幸今天能站在这里&#xff0c;与大家共同探讨一个在当前全球化数字浪潮中极具前瞻性和实践意义的话题&#xff1a;针对‘全球化域名’策略的AI审计&#xff0c;以及如何利用人工智能自动分配不同语种的抓…...

虚拟机锁定文件残留问题全解析:从.lck文件清理到权限修复

1. 虚拟机锁定文件问题的本质 刚接触虚拟机的朋友可能会遇到这样的场景&#xff1a;前一天用得好好的虚拟机&#xff0c;第二天开机突然提示"该虚拟机似乎正在使用中"。这种情况就像你去图书馆借书&#xff0c;系统显示书已经被借出&#xff0c;但实际上书就好好躺在…...

Token限制下的ChatGPT高效对话:如何优化Prompt长度与内容(含计算工具推荐)

Token限制下的ChatGPT高效对话&#xff1a;如何优化Prompt长度与内容&#xff08;含计算工具推荐&#xff09; 当ChatGPT成为日常开发和工作的重要工具时&#xff0c;许多用户都会遇到一个共同的瓶颈——Token限制。这个看似技术性的问题&#xff0c;实际上直接影响着我们与AI对…...

ESP32 低功耗模式下的 GPIO 状态锁定:从 Light Sleep 到 Deep Sleep 的实战指南

1. 为什么需要GPIO状态锁定&#xff1f; 做物联网设备开发的朋友应该都遇到过这样的场景&#xff1a;你的环境传感器在休眠时&#xff0c;需要保持某个LED指示灯的状态&#xff1b;或者智能门锁进入省电模式后&#xff0c;继电器必须维持当前的开闭状态。这时候如果GPIO状态意外…...

FLAC3D模拟浅基坑放坡开挖对临近既有隧道的影响

flac3d浅基坑放坡开挖对临近既有隧道的影响。"最近工地上碰到个头疼的问题&#xff0c;新建商业体的基坑开挖紧贴着地铁隧道&#xff0c;甲方非得要验证放坡方案的安全性。这时候FLAC3D的三维建模优势就派上用场了&#xff0c;特别是处理这种复杂的空间关系。先说说模型构…...

Handling of user login failure

Handling of user login failure 用户登录失败处理 维护旧系统的难度啊&#xff0c;你以为啊呢&#xff0c;阅读代码&#xff08;很费时间&#xff09;&#xff0c;如何实现&#xff0c;是否符合原先架构&#xff08;不是你开发的麻烦费时间&#xff09;&#xff0c;验证&…...

避坑指南:Seurat单细胞分析中,数据标准化(LogNormalize vs SCTransform)与PC数选择到底怎么选?

Seurat单细胞分析标准化方法与PC数选择的科学决策指南 1. 标准化方法的选择困境与解决方案 在单细胞RNA测序数据分析中&#xff0c;数据标准化是影响后续分析结果的关键步骤。Seurat提供了两种主流标准化方法&#xff1a;LogNormalize和SCTransform&#xff0c;它们各有特点&am…...

本地部署EmbeddingGemma-300m:Ollama让语义理解触手可及

本地部署EmbeddingGemma-300m&#xff1a;Ollama让语义理解触手可及 1. 为什么选择EmbeddingGemma-300m 在当今AI应用蓬勃发展的时代&#xff0c;文本嵌入技术已成为各类智能系统的核心组件。然而&#xff0c;大多数嵌入模型要么体积庞大、依赖高端硬件&#xff0c;要么性能不…...

VS2022从零开始构建C++项目的完整指南

1. 环境准备与项目创建 第一次打开Visual Studio 2022时&#xff0c;那个启动界面可能会让你有点懵。别担心&#xff0c;我刚开始用的时候也这样。先找到右下角那个醒目的"创建新项目"按钮&#xff0c;点它。这时候会弹出一个项目模板选择窗口&#xff0c;这里有个小…...

System.Drawing.Graphics进阶:手把手教你打造可动态更新的Winform纵向标签控件

深度解析System.Drawing.Graphics&#xff1a;构建高性能Winform纵向标签控件实战指南 在Winform开发中&#xff0c;标准控件库提供的横向文本标签往往无法满足特殊排版需求。本文将带您深入System.Drawing.Graphics的核心机制&#xff0c;从底层原理到实战优化&#xff0c;打造…...