【已解决】MySQL:常用的除法运算+精度处理+除数为0处理

目录

问题现象:

问题分析:

拓展:

1、除法运算:

拓展:MySQL中常用的几种除法运算

        1、取整除法

        2、浮点数除法

        3、取余除法

        4、向上取整除法

        5、向下取整除法

2、运算结果的精度处理

        1.1、浮点数

        1.2、总位数

        1.3、小数点后几位数

总结:

拓展:不要滥用cast句式

3、除数为0的处理

        3.1、在程序中处理

        3.2、sql中赋值为0

解决方法:


问题现象:

        今天在项目中遇到一个需求是需要开发一个用到数据统计的接口,那么就有可能需要使用sql语句来进行除法运算;那么如何解决mysql中除法运算的以下2个问题呢:

        1、运算结果的精度处理;

        2、除数为0的处理。


问题分析:

        首先,在进行数据统计相关的开发时,一般都会采用接口开发定时任务统计这两种情况;而数据的统计逻辑一般有两种方式:

        1、在数据库中进行简单运算,并将运算结果集返回给后端的dao层接口;

        2、从数据库获取数据,然后在后端程序中做数据统计逻辑;

        如果是简单的运算的话,可以采用第1种方式;而如果是需要进行大量复杂运算的话,建议采用第2种方式,如果你不确定的话也使用第2种方式,因为程序中可以很方便地实现简单运算,能完全兼容第1种方式,优点是可以定义各种变量来存储运算中的过程值;而第1种方式则适用于输出简单的运算结果。


拓展:

        当然,我们都知道在数据库中,其实也可以使用存储过程(可以理解为后端服务中的函数\方法),来实现类似于后端程序的复杂运算逻辑,但是使用存储过程比使用后端程序的效率要低,所以不建议使用数据库的存储过程代替后端程序的方式来实现数据统计逻辑。


       由于我这里需要做的是简单的除法运算,因此我想采用第1种方式来实现,那么现在就来分析一下文章开头提出了两个问题:

1、除法运算:

        MySQL中作除法运算有很多种,其中最简单且常用的就是直接使用除法运算符(/);这种除法的特点是:运算结果是个浮点数。

        例如:

select 10/5;
-- 结果:
-- 2.0000select 10/6;
-- 结果:
-- 1.6667

        可以发现:这种除法运算的默认规则就是:

        小数点后保留4位数,且采用四舍五入的规则。


拓展:MySQL中常用的几种除法运算

        MySQL中的除法运算有以下几种:

        1、取整除法

MySQL旧版本:
DIV(被除数, 除数)MySQL新版本:
被除数 DIV 除数

        这里需要注意的一点是:上面列出了在MySQL中新旧版本下的DIV句式的使用规则,如果版本不对就会报错,这里由于我用的版本是MySQL8+,算是新版本,所以旧版本的句式不适用,所以就会报错如下:

        所以如果报错的话,就换另一种句式试试吧。这里我只测试MySQL8+下成功的句式规则:             例如:

        2、浮点数除法

        运算结果是浮点数格式,默认是小数点后保留4位数,且采用四舍五入的规则。

        例如:

        3、取余除法

        取运算结果的余数,也就是在除不净时余下的数值。

        例如:

        4、向上取整除法

        得出运算结果后,先取整数部分;然后如果小数部分数值 > 0,则整数部分+1作为最终返回的结果。

        例如,10/3=3.333...3;由于结果是个处于整数3和整数4之间的浮点数,所以向上取整,结果为:4。

        5、向下取整除法

        得出运算结果后,取整数部分。

        例如,10/3=3.333...3;由于结果是个处于整数3和整数4之间的浮点数,所以向下取整,结果为:3。


2、运算结果的精度处理

        在mysql中可以使用以下句式来控制一个浮点数的精度:

cast(浮点数 AS DECIMAL(总位数, 小数点后几位数))

        这个句式需要用到3个参数:

        1.1、浮点数

        传入你想要操作的浮点数数据,在select...from语句中可以指定某个表的字段。

        1.2、总位数

        总位数指的是运算结果(浮点数)的总位数,分为两部分:小数点后数值的位数之和,所以总位数=小数点前数值的位数+小数点后数值的位数,这个总位数一定要设置的大一些,否则很容易踩坑的,后面我会提到。

        1.3、小数点后几位数

        对于运算结果,设置保留小数点后的几位数,也就是数学中常说的精确到小数点后几位数(精度)。

总结:

        这个句式理解起来和用起来都很简单,唯一需要注意的点就是总位数的设置,这个数据必须设置大一些,尽量靠近数据的上限长度(浮点数的总位数最大值),我一般会设置30。

        如果总位数设置太小,会导致数据失真,容易导致严重的数据问题。

        例子:

select cast(1234567890.1234567890 AS DECIMAL(30, 4));
-- 结果:
-- 1234567890.1235select cast(1234567890.1234567890 AS DECIMAL(14, 4));
-- 结果:
-- 1234567890.1235select cast(1234567890.1234567890 AS DECIMAL(10, 4));
-- 结果:
-- 999999.9999select cast(1234567890.12 AS DECIMAL(10, 4));
-- 结果:
-- 999999.9999

        通过观察上面这4个sql语句的执行结果,不难看出,当总位数 < 浮点数的总位数最大值时,数据就会出现“失真”现象,即:

        浮点数 > 总位数所能容纳的最大浮点数值,此时会直接返回该规则下的最大值,所以就能看到后面两个sql返回的结果是10个9(小数点后4个+小数点前6个);规则是首先满足小数点后有4位数,然后再从小数点往前取6位数,来凑够10位数字,以达到我们设置的总位数。


拓展:不要滥用cast句式

        这里有一个需要注意的点,就是不要滥用cast句式,我们只需要对最终的运算结果做精度设置即可,千万不要画蛇添足地给被除数和除数都做精度设置,否则就会出现以下这种情况:

        可以发现,我们给被除数和除数都设置了精度时,会把两个精度相加【(5,4)+(5,4)=(10,8)】作为运算结果的精度。我们可以分析一下这个结果是怎么得出来的:

第一步先执行:

得出真正的被除数:9.9999

第二步执行:

得出真正的被除数:1.0000

第三步把两个精度加起来作为最终结果的精度规则并做除法运算,相当于:

        而正确的sql应该是:

        由于总位数不够设置太小,导致失真,所以需要增大总位数:


3、除数为0的处理

        我们都知道,在除法运算中除数不能为0;

        但神奇的是:在MySQL中使用到除数为0的除法运算,是不会报错,但是返回的运算结果是Null;

        那么如果除数为Null呢?

        还是没报错,但返回的运算结果还是Null;

        但做过数据统计的小伙伴应该都知道:统计数据的报表中不会显示为null,而需要显示为0、0.0、0%等等,因此当除数为0时,这里提供有两种处理方法:

        3.1、在程序中处理

        当数据库返回的运算结果为null,程序中判断后即可对其做针对性处理,如报错,或者赋值为0等等。

        3.2、sql中赋值为0

        在MySQL中使用IFULLl句式进行处理,返回运算结果0,如下:


解决方法:

        除法运算精度和除数为0的综合处理:

        先设置精度,再处理0:

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

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

相关文章

android 怎么自定义view

首先了解view的绘制流程: 所以onmeasure ---测量view onlayout---确定view大小----》所以继承ViewGroup必须要重写onlayout,确定子view 而onDraw----是继承view时候需要操作的。 所以:自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件。 自定义Vi…

python打包时遇见第三方包有隐藏依赖或者出现依赖错误

使用pyinstaller 打包成exe 文件步骤&#xff1a; 1.创建虚拟环境&#xff0c;并激活虚拟环境 #创建虚拟环境 python -m venv myenv #激活虚拟环境&#xff08;windows&#xff09; myenv\Scripts\activate2.导出需要的依赖 pip freeze > requirements.txt 或者 pip list …

AutoCAD 2020:三维建模与渲染,设计未来的建筑蓝图

AutoCAD 2020是一款功能强大且广泛应用的计算机辅助设计软件&#xff0c;它以其卓越的性能和丰富的功能&#xff0c;满足了机械、建筑、家居、纺织等诸多行业的设计需求。以下是AutoCAD 2020的一些主要功能介绍&#xff1a; 保存和安装优化&#xff1a;AutoCAD 2020在性能上进…

观成科技-基于自适应学习的人工智能加密流量检测技术

1.前言 人工智能技术的广泛应用正在深刻改变我们的生活。在网络安全领域&#xff0c;基于机器学习的检测技术也应用在许多场景中。随着信息技术的迅猛发展和数字化转型的深入推进&#xff0c;加密技术逐渐成为保障网络安全和数据隐私的核心手段&#xff0c;而基于机器学习的检…

每日五道java面试题之mybatis篇(四)

目录&#xff1a; 第一题. 映射器#{}和${}的区别第二题. 模糊查询like语句该怎么写?第三题. 在mapper中如何传递多个参数?第四题. Mybatis如何执行批量操作第五题 MyBatis框架适用场景 第一题. 映射器#{}和${}的区别 #{}是占位符&#xff0c;预编译处理&#xff1b;${}是拼接…

windows 安装cuda 11.2过程记录

参考&#xff1a; https://blog.csdn.net/m0_45447650/article/details/123704930 https://zhuanlan.zhihu.com/p/99880204?from_voters_pagetrue 在显卡驱动被正确安装的前提下&#xff0c;在命令行里输入nvidia-smi.exe 下载CUDA Toolkit: https://developer.nvidia.com/…

CrossEntropyLoss 和NLLLoss的关系

交叉熵损失在做一件什么事? 看公式: x是预测(不需要softmax归一化),y是label, N是batch维度的数量,交叉熵损失,干了三件事. 1. 对输入在类别维度求softmax 2. 多softmax后的数,求log 3. 对(样本数, 类别数)为shape的tensor计算NLLLoss. 其中,NLLloss做的就是log取负, 和o…

java入门 - 规范你的代码注释

java基础语法-代码注释 注释只是为了提高可读性&#xff0c;不会被计算机编译。代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率。也是程序代码可维护性的重要环节之一。 开发中注释可以分为三种方式&#xff1a; 行注释块注释类/方法注释…

Linux 大页内存 Huge Pages 虚拟内存

Linux 大页内存 Huge Pages 虚拟内存 - 秋来叶黄 - 博客园 (cnblogs.com) Linux为什么要有大页内存&#xff1f;为什么DPDK必须要设置大页内存&#xff1f;这都是由系统架构决定的。一开始为了解决一个问题&#xff0c;设计了对应的方案&#xff0c;随着事物的发展&#xff0c…

Splitpanes拆分窗格插件使用

目录 基本用法 纵向排列 遍历渲染 动态拆分宽度 项目开发中用到了拆分窗格(就是下面的效果&#xff0c;可以拆分网页&#xff0c;我们项目通常都是用左右两块拆分&#xff0c;可以通过拖动图标进行左右拖动)&#xff0c;于是就发现了一个很好用的插件&#xff1a;Splitpane…

上位机图像处理和嵌入式模块部署(qmacvisual畸变矫正)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大部分同学在开始做计算机图像的时候&#xff0c;是没有意识到畸变矫正这个问题的。当然不仅仅是畸变矫正&#xff0c;很多同学还会忽略光源的问题…

python异常:Exception、BaseException接收异常,并打印异常信息msg

except IOEerror 只能接收到 IO 类型的错误&#xff0c;对于抛出的 NameError 类型的错误&#xff0c;在 Python 中所有的异常类都继承 Exception&#xff0c;所以我们可以使用它来接收所有的异常。 1.Exception接收异常 源码&#xff1a; open("test1.py",r) pr…

4款智能文章生成器推荐,为你创作文章效率高

智能文章生成器的出现为创作者带来了很多方便&#xff0c;尤其是在当今信息爆炸的时代&#xff0c;内容创作已经成为许多人日常工作中不可或缺的一部分。无论是博客、新闻报道、营销文案还是学术论文&#xff0c;高质量的文章往往需要耗费大量的时间和精力来撰写。但有了智能文…

固态硬盘格式化后怎么恢复 固态硬盘被格式化后如何恢复

你知道吗,固态硬盘被格式化后,还有一线生机可以让你把数据找回来!固态硬盘被格式化后如何恢复?不要慌张,我们来一步一步地看看该怎么做。首先,你需要知道格式化并不是真正意义上的删除数据,而是把硬盘上的文件系统清空,让数据变得不可见。所以,只要你没有在格式化后往…

Linux —— 定时任务(sleep、crontab、at)

目录 1、使用 sleep 来完成定时任务 2、使用 crontab 来进行定时任务 3、使用 at 来执行单次的定时任务 1、使用 sleep 来完成定时任务 sleep n 等待 n 秒再继续往后执行 usleep n 等待 n 微秒再继续往后执行&#xff08;1 秒等于 1 000 000 微秒&#xf…

uniapp使用Echarts图表H5显示正常 打包app显示异常

uniapp使用Echarts在H5页面调试 调试完在H5正常显示 然后通过安卓机调试的时候 发现直接空白了 还有这个爆错 Initialize failed: invalid dom 我有多个图表、图表是通过v-for循环出来的 解决方案 原来是yarn直接安装Echarts 然后改成本地JS文件引入 gitbub文件地址 — dist/…

二十几岁的我们:在旷野中找寻自我

二十几岁&#xff0c;这是一个充满变数、充满机遇和挑战的年纪。它如同一片辽阔的旷野&#xff0c;每个人都在其中寻找自己的方向&#xff0c;摸索着自己的道路。这是一个既令人兴奋又令人迷茫的年纪&#xff0c;我们穿着不同的鞋子&#xff0c;注定要走不同的路。 在这个年纪里…

面向对象(下)

目录 01、static1.1、static的使用1.2、static应用举例1.3、单例(Singleton)设计模式 02、main方法的语法03、类的成员之四&#xff1a;代码块04、关键字&#xff1a;final05、抽象类与抽象方法5.1、多态的应用&#xff1a;模板方法设计模式(TemplateMethod) 06、接口(interfac…

(九)Android布局类型(约束布局ConstraintLayout)

约束布局&#xff08;ConstraintLayout&#xff09;与相对布局差不多&#xff0c;是创建一个应用后默认的布局方式&#xff0c;比相对布局更加灵活&#xff0c;一般用于平铺的布局&#xff08;不适用于层叠布局&#xff09;&#xff0c;常用于托拖拽方式构建页面&#xff0c;最…

第五篇:数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南》

第五篇&#xff1a;第五篇&#xff1a;数字视频广告格式概述 - IAB视频广告标准《数字视频和有线电视广告格式指南 --- 我为什么要翻译介绍美国人工智能科技公司IAB系列技术标准&#xff08;2&#xff09; ​​​​​​​翻译计划 第一篇序言第二篇简介和目录第三篇概述- IA…