• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

java 如何计算同比增长工具类

java 搞代码 4年前 (2022-01-05) 73次浏览 已收录 0个评论
文章目录[隐藏]

这篇文章主要介绍了java 如何计算同比增长工具类的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

java 计算同比增长工具类

为了数据的严谨性,统一装换为BigDecimal,话不多说,看代码。

 package com.pig4cloud.pigx.admin.api.util; import java.math.BigDecimal; public class PercentCount { public String percentBigDecimal(BigDecimal preNum,BigDecimal sufNum){ double result = countDecimal(preNum,sufNum); if(result>0){ return "+"+result+"%"; } if(result<0){ return result+"%"; } if(result==0){ return "+"+0+"%"; } return null; } public  double countDecimal(BigDecimal preNum,BigDecimal sufNum){ boolean preBoolean = verifyNum(preNum); boolean sufBoolean = verifyNum(sufNum); //同时为true计算 if(preBoolean && sufBoolean){ boolean b = verifyEqual(preNum, sufNum); if (b == false){ return realCountDecimal(preNum,sufNum); } if (b){ return 0; } } if(preBoolean == false && sufBoolean ==false){ return 0; } if(sufBoolean ==false){ return 100; } return  0; } //验证数字是否为零和null public boolean verifyNum(BigDecimal num){ if(null !=num && num.compareTo(BigDecimal.ZERO)!=0 ){ return true; } return false; } //验证两个数字是否相等 public boolean verifyEqual(BigDecimal preNum,BigDecimal sufNum){ int n = preNum.compareTo(sufNum); //比较 -1 小于   0 等于    1 大于 if(n==0){ return true; } return false; } //真正计算 public double realCountDecimal(BigDecimal preNum,BigDecimal sufNum){ //(前面的数字-后面的数字)/后面的数字*100 BigDecimal bigDecimal = (preNum.subtract(sufNum)).divide(sufNum).multiply(new BigDecimal("100")).setScale(2, BigDecimal.ROUND_UP); if (bigDecimal.compareTo(BigDecimal.ZERO) !=0){ return  bigDecimal.doubleValue(); } return 0; } public static void main(String[] args) { PercentCount p = new PercentCount(); BigDecimal a = new BigDecimal("3"); BigDecimal b = new BigDecimal("1"); String percent = p.percentBigDecimal(a, b); System.out.println(percent); } } 

Java计算同比环比

同比环比计算基本概念和计算公式

同比率:本年数据比上一年数据增长或减少的比率

同比率计算公式:rate = (本年数据 – 前一年数据) / 前一年数据

实例:2020年10月游客数量为80W,2019年10月游客数量为100W,2018年10月游客数量为90W

2020年同比率为:rate :(80 – 100)/100 * 100%= -20%

2019年同比率为:rate :(100 – 900)/900 * 100%= +11%

(“+” 为增长,“-”为降低)

环比率:本月(季度)数据比上个月(季度)数据增长或减少的比率

环比率计算公式:rate = (本月数据 – 上个月数据) / 上个月数据

实例:2020年10月游客数量为100W,2020年9月游客数量为90W,2020年7月游客数量为80W

2020年10月同比率为:rate :(100 – 90)/90 * 100%= +11%

2019年10月同比率为:rate :(90- 80)/800 * 100%= +12.5%

注:同比环比计算公式是相同的,但计算数据对应的时间是不同的

代码实现逻辑

通过Calendar等时间函数和HashMap,[ hashmap(key,value) key为时间,value为该时间对应的值]。将key和value一一对应的存入集合中,通过对key进行操作,再用key获取HashMap中相对应的value,套公式计算(重点在于对时间(key)的操作,通过key可直接获取value进行计算)

详细逻辑步骤

首先通过SQL语句获取数据库中相应的时间和该时间对应的数据,按时间分组排序

 SELECT DATAS.DATE AS NAME , SUM( DATAS.VISITORSUM) AS VALUE, 2 AS sfzj, '' AS bfb FROM (SELECT TOURIST.* ,CONCAT(YEAR,'年',QUARTER,'月') AS DATE FROM TOURISTFLOW TOURIST)DATAS GROUP BY DATAS.DATE ORDER BY DATAS.DATE 

接着设置时间范围,将最早的时间减去一年设为最小时间,最后的时间为最大时间,以此为范围即可保证覆盖所有数据

 // 设置时间范围 // 获取最前的时间的第一个列表 analyzeBean firstTimeSubway = analyzeByYear.get(0); String startTime = firstTimeSubway.getTime(); // 获取最后时间的最后一个列表 analyzeBean endTimeSubway = analyzeByYear.get(analyzeByYear.size() - 1); String endTime = endTimeSubway.getTime(); // 时间格式转换 SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月"); Date parse = format.parse(startTime); Date parse1 = format.parse(endTime); Calendar c = Calendar.getInstance(); c.setTime(parse); c.add(Calendar.YEAR, -1); Date y = c.getTime(); // 获取最前的时间的前一年的时间作为查询范围 String firstTime = format.format(y); analyzeRequestBean.setStartTime(firstTime); Calendar c1 = Calendar.getInstance(); c1.setTime(parse1); Date y1 = c1.getTime(); // 获取最后一年的时间作为查询范围 String lastTime = format.format(y1); analyzeRequestBean.setStartTime(lastTime); 

在将所有数据的结果集存入HashMap中 hash(key,value) key为时间,value为数据值

 hashMap.put(time, analyzeByYear.get(i).getValue());

最后通过for循环和CaleCndar函数和Date函数对时间(key)进行相应的操作,再通过时间(key)到HashMap中找对应的值进行计算

 for (int i = 0; i  value1) { analyzeBean.setSfzj(1); } else { analyzeBean.setSfzj(0); } // 2个值减法 绝对值 int abs = Math.abs(value - value1); float a = (float) (abs) / (float) value1 * 100; analyzeBean.setBfb(a + ""); } } else { analyzeBean.setSfzj(2); analyzeBean.setBfb(null); } } } 

同比实例代码:

 // 求同比 @Override public Result getAnalyzeByYear(AnalyzeRequestBean analyzeRequestBean) { try { // 检查参数 if (null == analyzeRequestBean) { return ResultUtil.fail(ResultEnum.PARAMS_ERROR); } a List analyzeByYear = InfoMapper.getAnalyzeByYear(analyzeRequestBean); if (analyzeByYear == null || analyzeByYear.size() == 0) { return ResultUtil.ok(null); } // 设置时间范围 // 获取最前的时间的第一个列表 analyzeBean firstTimeSubway = analyzeByYear.get(0); String startTime = firstTimeSubway.<strong style="color:transparent">来源gaodai#ma#com搞@代~码网</strong>getTime(); // 获取最后时间的最后一个列表 analyzeBean endTimeSubway = analyzeByYear.get(analyzeByYear.size() - 1); String endTime = endTimeSubway.getTime(); // 时间格式转换 SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月"); Date parse = format.parse(startTime); Date parse1 = format.parse(endTime); Calendar c = Calendar.getInstance(); c.setTime(parse); c.add(CaleCndar.YEAR, -1); Date y = c.getTime(); // 获取最前的时间的前一年的时间作为查询范围 String firstTime = format.format(y); analyzeRequestBean.setStartTime(firstTime); Calendar c1 = Calendar.getInstance(); c1.setTime(parse1); Date y1 = c1.getTime(); // 获取最后一年的时间作为查询范围 String lastTime = format.format(y1); analyzeRequestBean.setStartTime(lastTime); // 把大范围的结果集都放入hashMap中 HashMap hashMap = new HashMap(); for (int i = 0; i  value1) { analyzeBean.setSfzj(1); } else { analyzeBean.setSfzj(0); } // 2个值减法 绝对值 int abs = Math.abs(value - value1); float a = (float) (abs) / (float) value1 * 100; analyzeBean.setBfb(a + ""); } } else { analyzeBean.setSfzj(2); analyzeBean.setBfb(null); } } } return ResultUtil.ok(analyzeByYear); } catch (ParseException ex) { ex.printStackTrace(); } return ResultUtil.ok(null); } 

环比类似,只是把c.add(Calendar.YEAR, 0);换成c.add(Calendar.MONTH, 0)

实现逻辑其实不难,只是我写复杂了,如有更好的方法欢迎留言交流讨论

以上为个人经验,希望能给大家一个参考,也希望大家多多支持gaodaima搞代码网

以上就是java 如何计算同比增长工具类的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:java 如何计算同比增长工具类

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址