【已解决】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.0000



select 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.1235



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



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


select 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:

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

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

相关文章

c++的const总结(转)

为什么使用const&#xff1f;采用符号常量写出的代码更容易维护&#xff1b;指针常常是边读边移动&#xff0c;而不是边写边移动&#xff1b;许多函数参数是只读不写的。const最常见用途是作为数组的界和switch分情况标号(也可以用枚举符代替)&#xff0c;分类如下&#xff1a;…

什么是网站?为什么要搭建网站?

网站&#xff1a;简单来说&#xff0c;网站就是通过互联网来展示信息的页面集合。它可以在电脑或者手机上打开&#xff0c;提供各种功能&#xff0c;比如查看新闻、购买商品、搜索信息等。 一、建网站的目的&#xff1a;展示个人或企业的存在 网站建设的首要目的之一是展示个人…

十年追光者 | 一段人生故事,聆听《康岛天香》创始人李波的成长历程

​为了响应国家乡村振兴&#xff0c; 绿水青山就是金山银山&#xff0c; 中药材复兴等 国家政策&#xff0c;来自老家河南的李波女士&#xff0c;如今在海南澄迈县桥头镇 开启了她的沉香创业故事&#xff0c; 沉香树一直以来被誉为海南第四颗树&#xff0c; 从最早 20 亩沉香…

java入门 -输入和输出

输入输出 开发中大量会使用输入和输出&#xff0c;今天来总结一下Java语法阶段常使用的输入和输出。 输出 System.out 控制台输出信息。 不换行显示一行&#xff1a; System.out.print( ); System.out.print("hello "); System.out.print("java!");运行结…

JMeter压测SpringBoot项目

压力测试架构图如下: 配置JMeter 在JMeter的bin目录,双击jmeter.bat 新建一个测试计划,并右键添加线程组: 进行配置 一共会发生4万次请求。 ctrl + s保存; 添加http请求: 配置http请求: 配置断言,来判断当前请求是否成功: 正常响应如下:

Tomcat Session ID---会话保持

简单拓补图 一、负载均衡、反向代理 7-1nginx代理服务器配置 [rootdlnginx ~]#yum install epel-release.noarch -y ###安装额外源[rootdlnginx ~]#yum install nginx -y[rootdlnginx ~]#systemctl start nginx.service[rootdlnginx ~]#systemctl status nginx.service [ro…

机器人路径规划:基于Bug算法的机器人路径规划(提供Python代码)

一、Bug算法简介 Bug 算法是一种基于追踪障碍物的路径规划算法&#xff0c;它模拟了一种昆虫寻找巢穴的行为&#xff0c;因此得名Bug算法。Bug算法的基本思路是&#xff1a;当机器人遇到障碍物时&#xff0c;他会沿着障碍物的边缘行走&#xff0c;直到到达目标点。该算法可以分…

如何定期清理数据库中的无效数据?

企业的数据库在运行相当长一段时间后&#xff0c;都会出现无效数据的堆积&#xff0c;这些数据包含了过时、重复、错误、缺失&#xff08;空字段&#xff09;的数据&#xff0c;长期占据着宝贵的数据库空间。而在上云热潮的推动下&#xff0c;绝大多数企业已经将他们的业务数据…

Ingress 基于URL路由多个服务

文章目录 前言一、基于请求地址转发不同应用的pod1.创建一个nginx的pod和一个apache的pod及其各自的service2.创建ingress实现一个地址两个path分别访问nginx和apache3.验证根据域名web2.study.com的两个路径/foo和/bar来访问到不同的pod4.分别在nginx和apache的pod里创建网站目…

张驰咨询为领益智造打造精益六西格玛管理体系,助力苹果全球供应链优化

近日&#xff0c;领益智造精益六西格玛项目在总部启动&#xff0c;作为领益智造精益六西格玛管理战略合作伙伴&#xff0c;张驰咨询精益六西格玛咨询顾问团队已进驻领益智造总部&#xff0c;指导学员项目选择。作为管理创新的重要举措&#xff0c;领益智造在中国各大区超过10个…

1.MongoDB的特点与应用场景

什么是 MongoDB &#xff1f; MongoDB 是基于 C 开发的 NOSQL 开源文档数据库 &#xff0c;是最像关系型数据库的 nosql&#xff0c;功能也是最丰富的 nosql&#xff0c;它具有所以的可伸缩性&#xff0c;灵活性&#xff0c;高性能&#xff0c;高扩展性的优势。 大致有如下特…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:Refresh)

可以进行页面下拉操作并显示刷新动效的容器组件。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 支持单个子组件。 从API version 11开始&#xff0c;Refresh子组件会跟随手势下拉而下移…

适口性猫粮哪个牌子肉源好性价比高?主食冻干性价比排行前十分享

随着科学养猫知识的普及&#xff0c;主食冻干喂养越来越受到养猫人的青睐。主食冻干不仅符合猫咪的饮食天性&#xff0c;还能提供均衡的营养&#xff0c;有助于维护猫咪的口腔和消化系统健康。然而&#xff0c;许多猫主人在选择主食冻干产品时感到迷茫。本文将深入探讨如何为猫…

前端基础篇-快速了解 Vue 前端框架(Vue 指令)

&#x1f525;博客主页&#xff1a; 【小扳_-CSDN博客】 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 Vue 概述 2.0 Vue 指令 2.1 指令 - v-bind 2.2 指令 - v-model 2.3 指令 - v-on 2.4 指令 - v-if、v-else-if、v-else 2.5 指令 - v-show 2.6 指令 - v-for 3.0 生…

软件测试工程师教你如何做好职业发展规划

今天将为大家带来一篇关于软件测试工程师职业生涯阶段发展方向分析的文章&#xff0c;准备做测试人员和正在做测试的小伙伴们&#xff0c;我们一起来看一看吧。由于新时代下国内软件测试行业目前的发展迅速、需求旺盛&#xff0c;在国内的软件测试职位晋升一般要比国外快&#…

2024最全电商API接口 高并发请求 实时数据 支持定制 电商数据 买家卖家数据

电商日常运营很容易理解&#xff0c;就是店铺商品维护&#xff0c;上下架&#xff0c;评价维护&#xff0c;库存数量&#xff0c;协助美工完成制作详情页。店铺DSR&#xff0c;好评率&#xff0c;提升客服服务等等&#xff0c;这些基础而且每天都必须做循环做的工作。借助电商A…

宝马发生数据泄露事件,涉及中国、欧洲和美国三地

据悉&#xff0c;汽车巨头宝马的云存储服务器发生配置错误&#xff0c;导致包含敏感信息的私钥和内部数据泄露。 研究人员 Can Yoleri 在例行扫描时发现&#xff0c;宝马在微软 Azure 上的开发环境存储服务器被错误配置为公共访问&#xff0c;本应设置为私有。该存储服务器包含…

移动性模拟助力现实世界实现更优交通决策

什么是移动性模拟&#xff1f; 每天&#xff0c;数以百万计的人在各个地区、城市和空间中流动。移动性模拟将真实世界的数据与模型相结合&#xff0c;揭示人们通常选择的路程&#xff0c;从而帮助了解这些流动。 移动性受小汽车和公共汽车、公路、火车、桥梁、隧道等资产影响…

Axure RP基础功能详解,让你一目了然!

当我们谈论交互设计和用户体验时&#xff0c;axurerp的名字不容忽视。本文将全面解释什么是axurerp&#xff0c;以及如何帮助设计师和开发人员创建高度互动的原型&#xff0c;作为一个强大的工具。 什么是Axure rp&#xff1f; axurerp是一种专业的快速原型设计工具&#xff…