MySql自定义函数-关于保留小数位的特殊需求
背景
昨天,关于价格详情接口又来了一个小需求,而且有点特别。价格显示:改为保留两位小数,没错,就是保留两位小数。大家是不是想说这没啥特别的。。。数据库都有函数搞定了。例如四舍五入的ROUND(x,d),直接截取的TRUNCATE(x,d),还可以利用类型转换CONVERT(value,type)等等。但是,上面的都不能满足这个保留两位的特殊需求,我们来看一下究竟怎么保留两位:小数点两位后,只要大于0的,就直接进一。例如:1.8100 -> 1.81,1.8102 -> 1.82
分析
那么,这需要怎么解决呢,数据库好像确实没函数来这么弄了,那么只能在sql里判断,或者java里判断了。因为这要快速搞定,就直接在sql里入手了。其实也很简单:如果原数比直接截取两位后的数大,表示两位后还有数,然后就直接+0.01。
sql这么改:
if(price > TRUNCATE(price,2),TRUNCATE(price,2)+0.01,TRUNCATE(price,2)) AS elecPrice
优化-编写自定义函数
回头一想,sql好像写得有点僵硬,如果有多个字段需要这样显示,那岂不是每个都要写这么长一串。又如果不是保留两位,而是保留三位,那么岂不是之前的sql又得全部改一遍。。这么一想,我突然就很头疼。程序员嘛,还是得有点追求,不能只为解决问题,一定要自己思考一种比较好的方案:通用的,简洁的。最后,自己编写了一个通用的函数,可以自定义位数,然后返回处理后的数字。关于MySql如何编写自定义函数,大家可以自己百度一下,下面直接上函数:
drop FUNCTION if exists ENTER_ONE;
create function ENTER_ONE(origin decimal(5,4),digit INT) returns decimal(3,2)
begin
DECLARE result FLOAT;
IF origin > TRUNCATE(origin,digit) THEN
set result = TRUNCATE(origin,digit)+1/POWER(10,digit);
ELSE
set result = TRUNCATE(origin,digit);
END IF;
return result;
end;
下面简单解释一下:
首先,调用此函数得传入两个参数,第一个是要处理的浮点数origin,第二个是要保留的位数digit。
然后,定义好结果result后,开始进行逻辑判断。当然了,还是上面的配方,原数和直接截取digit位后的数进行比较,如果大:则直接截取digit为后的数加上1除去10的digit次方。否则,直接截取digit为数。
最后返回结果result即可。
sql就变得想当简单了:
ENTER_ONE(price,2) as elecPrice
总结
作为程序员,一定要有善于思考,善于总结的能力和习惯,每次解决一个问题,我们要判断这能否做成一个通用的组件或者工具类,方便以后有此需求的小伙伴!
MySql自定义函数-关于保留小数位的特殊需求的更多相关文章
- mysql 自定义函数
原文:http://www.cnblogs.com/zhangminghui/p/4113160.html 引言 MySQL本身提供了内置函数,这些函数的存在给我们日常的开发和数据操作带来了很大的便利 ...
- mysql自定义函数并在存储过程中调用,生成一千万条数据
mysql 自定义函数,生成 n 个字符长度的随机字符串 -- sql function delimiter $$ create function rand_str(n int) returns VA ...
- MySQL 自定义函数CREATE FUNCTION实例
分享一个MySQL 自定义函数CREATE FUNCTION的实例.mysql> delimiter $$mysql> CREATE FUNCTION myFunction-> (i ...
- MySQL自定义函数(四十六)
MySQL自定义函数 一.什么是MYSQL自定义函数? mysql当中的自定义函数,我们简称为UDF,它实际上是一种对MySQL扩展的途径,其用法与内置函数相同. 二.自定义函数应该具备哪些条件? 我 ...
- MySQL自定义函数
用户自定义函数(user-defined function,UDF)是一种对MySQL扩展的途径,其用法与内置函数相同. 自定义函数两个必要条件: 参数:可以有另个或多个 返回值:只能有一个 创建自定 ...
- MySQL自定义函数用法详解-复合结构自定义变量/流程控制
自定义函数 (user-defined function UDF)就是用一个象ABS() 或 CONCAT()这样的固有(内建)函数一样作用的新函数去扩展MySQL. 所以UDF是对MySQL功能的一 ...
- MySQL自定义函数与存储过程
1.前置条件 MySQL数据库中存在表user_info,其结构和数据如下: mysql> desc user_info; +-----------+----------+------+---- ...
- mysql自定义函数语法
创建函数 DELIMITER $$DROP FUNCTION IF EXISTS `test` $$CREATE FUNCTION `test`(a int ,b int)RETURNS int BE ...
- java mysql自定义函数UDF之调用c函数
正如sqlite可以定义自定义函数,它是通过API定义c函数的,不像其他,如这里的mysql.sqlite提供原生接口就可以方便的调用其他语言的方法,同样的mysql也支持调用其它语言的方法. goo ...
随机推荐
- 牛客-2018多校算法第五场D-集合问题+并查集
集合问题 题意: 给你a,b和n个数p[i],问你如何分配这n个数给A,B集合,并且满足: 若x在集合A中,则a-x必须也在集合A中. 若x在集合B中,则b-x必须也在集合B中. 思路:并查集操作,自 ...
- POJ-2502 Subway( 最短路 )
题目链接:http://poj.org/problem?id=2502 Description You have just moved from a quiet Waterloo neighbourh ...
- CodeForces gym Nasta Rabbara lct
Nasta Rabbara 题意:简单来说就是, 现在有 n个点, m条边, 每次询问一个区间[ l , r ], 将这个区间的所有边都连上, 如果现在的图中有奇数环, 就输出 “Impossibl ...
- lightoj 1068 - Investigation(数位dp)
An integer is divisible by 3 if the sum of its digits is also divisible by 3. For example, 3702 is d ...
- lightoj 1074 - Extended Traffic(spfa+负环判断)
题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1074 题意:有n个城市,每一个城市有一个拥挤度ai,从一个城市I到另一个城市J ...
- Java服务器-Disruptor使用注意
最近看了一下部署游戏后台的服务器状况,发现我的一个Java程序其占用的CPU时长超过100%,排查后发现竟是Disruptor引起的,让我们来看看究竟为什么Disruptor会有这样的表现. 发现占用 ...
- 【Offer】[33] 【二叉搜索树的后序遍历序列】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果.如果是则返回true, 否则返回false. 假设输入的数组的任意两个数字 ...
- Tomcat原理系列之六:详解socket如何封装成request(上)
目录 参与者 总结 @(详解socket如何封装成request) 看源码虽然不能马上提升你的编码水平.但能让你更好的理解编程. 因为我们tomcat多是以NIO形式处理请求,所以本系列讲的都是NIO ...
- 基于servlet的图书管理系统
该项目是Java语言开发的图书管理系统,IDE采用eclipse,技术采用servlet,数据库使用mysql,前端页面采用bootstrap框架,简介美观. 系统具备基础的功能,读者可以注册登录,登 ...
- android 百度地图入门01 (史上最详没有之一)
最近一直和百度地图打交道,写几篇博客记录一下吧,目前最新版是4.0的 ,之前我用的是3.7的, 就以4.0的为例说一下最基本的配置流程吧. 一.准备工作 1.申请一个百度地图开发者账户--地址:htt ...