相关文章:

  • tim工具包-dao层查询工具
  • tim工具包-sql管理平台-admin
  • tim工具包-自动生成api接口
  • tim工具包-MyMath牛逼的计算工具
  • tim工具包-数据处理工具

java 数学计算工具

java 对数学计算的使用性上还是比较麻烦的,遇到大量数据计算复杂的计算公式则会频发问题。接下来我们来统计一下在java中经常会遇到的计算问题

  • 科学计数法
  • 保留小数点问题
  • 复杂公式处理麻烦
  • 除数为零

案例:

比如说我需要计算一下数据

案例1

100*2000/20*(20-10)

使用java原生BigDecimal来写计算会非常痛苦,所以封装了一套工具供大家使用

 public void test(){BigDecimal bigDecimal = new BigDecimal(100);bigDecimal= bigDecimal.multiply(new BigDecimal(2000));bigDecimal=bigDecimal.divide(new BigDecimal(20));BigDecimal b2 = new BigDecimal(20);BigDecimal b3 = new BigDecimal(10);b2 = b2.subtract(b3);bigDecimal = bigDecimal.multiply(b2);System.out.println(bigDecimal.setScale(2).doubleValue());}

使用MyMath 工具写法

public void myMathTest(){MyMath.test("%s*%s/%s*(%s-%s)","100","2000","20","20","10");}

不论是代码可读性,和代码量以及维护性功能都是大大提升的

MyMath 功能介绍

MyMath 自动会处理科学计算法,异常数据等。使用的是js计算

  • 普通计算
 String value1= MyMath.test("100*2000/20*(20-10)");或者String value= MyMath.test("%s*%s/%s*(%s-%s)","100","2000","20","20","10");
  • 布尔计算
boolean b = MyMath.test2("10>=(5-1)");
或者
boolean b1 = MyMath.test2("%s>=(%s-%s)", "10", "5", "1");
  • 得分计算

得分计算如果都不满足条件则返回0分

String score = MyMath.getScore("Math.abs(%s-%s)<=10:10,Math.abs(%s-%s)<=15:5", "10", "20");结果得10分
计算已,号做分割。从做往右依次计算。如果满足条件则返回:后面的得分,如果一个都未满足则返回0分
  • 代值计算
   Map<String, Object> map = new HashMap<>();map.put("a", 1);map.put("cost", 3);map.put("num", 3);System.out.println(mathKeysName("[a]*[num]*[num]-[cost]+10", "4", map));16.0000

MyMath 核心代码

package com.utils;import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class MyMath {String[] str = {"NaN", "Infinity"};public static ScriptEngine engine = new ScriptEngineManager().getEngineByName("js");/*** 判断* (** @param str 数学公式* @return*/public static boolean test2(String str) {str = str.replaceAll("null", "0");try {if (VerifyUtil.isEmpty(str)) return false;str = str.replace("--", "+");Object result = engine.eval(str);if (result instanceof Boolean)return (boolean) result;} catch (ScriptException e) {e.printStackTrace();}return false;}/*** 判断计算** @param str  数学占位符公式* @param strs 替换数据* @return*/public static boolean test2(String str, String... strs) {str = String.format(str, strs);return test2(str);}/*** 累加** @param baseNum* @param num* @return*/public static String append(String baseNum, String num) {return MyMath.test(baseNum + "+" + getNumber(num));}/*** 累加** @param baseNum* @param key* @return*/public static String append(String baseNum, Map<String, Object> param, String key) {if (VerifyUtil.isEmpty(param)) return "0";return append(baseNum, getNumber(param.get(key)));}public static String getNumber(Object object) {if (VerifyUtil.isEmpty(object)) return "0";return object + "";}/*** 判断** @param str 数学公式* @return*/public static boolean isInt(String str) {str = str.replaceAll("null", "0");if (VerifyUtil.isEmpty(str)) return false;str = str.replace("--", "+");Object result = null;try {result = engine.eval(str);} catch (ScriptException e) {e.printStackTrace();return false;}if (result instanceof Boolean)return (boolean) result;return false;}/*** 4位小数点** @param str 数学公式* @return*/public static String test(String str) {return endMath(str, "###0.0000");}/*** 计算得出结果** @param str  占位符公式* @param strs 替换值* @return*/public static String testValues(String str, String... strs) {str = String.format(str, strs);return test(str);}/*** 转换整数字符串,科学计算法也可以转换** @param str* @return*/public static String tesInt(String str) {return endMath(str, "###0");}/*** 8位小数点** @param str* @return*/public static String end8(String str) {return endMath(str, "###0.00000000");}/*** 保留小数点计算** @param str     占位符公式* @param toFixed 保留小数点数* @param strs    替换值* @return*/public static String testToFixed(String str, Object toFixed, String... strs) {str = String.format(str, strs);return testToFixed(str, toFixed);}/*** 保留小数点计算** @param str  占位符公式* @param strs 替换值* @return*/public static String test(String str, String... strs) {str = String.format(str, strs);return testToFixed(str, 4);}/*** 抛出异常计算,用来定位做了什么处理** @param str     占位符公式* @param toFixed 保留小数位数* @param strs    替换值* @return* @throws MathException 抛出异常,包含计算错误公式*/public static String testMathException(String str, Object toFixed, String... strs) throws MathException {str = String.format(str, strs);return testException(str, toFixed);}/*** 抛出异常计算,用来定位做了什么处理** @param str     计算公式* @param toFixed 保留小数位* @return* @throws MathException*/public static String testException(String str, Object toFixed) throws MathException {str = str.replaceAll("null", "0");if (VerifyUtil.isEmpty(str)) return "0";str = str.replace("--", "+");Object result = 0;try {result = engine.eval(str);DecimalFormat decimalFormat = new DecimalFormat("###0.0000000000000000");//格式化设置result = decimalFormat.format(result);if (isInteger(result + "")) {BigDecimal bigDecimal = new BigDecimal(result + "");result = bigDecimal.setScale(getToFixed(toFixed), BigDecimal.ROUND_HALF_UP).toPlainString();}} catch (ScriptException e) {throw new MathException(str);}return isNumber(result + "");}/*** 普通计算保留小数位** @param str     计算公式* @param toFixed 保留小数位* @return*/public static String testToFixed(String str, Object toFixed) {str = str.replaceAll("null", "0");if (VerifyUtil.isEmpty(str)) return "0";str = str.replace("--", "+");Object result = 0;try {result = engine.eval(str);DecimalFormat decimalFormat = new DecimalFormat("#####0.00000");//格式化设置result = decimalFormat.format(result);if (isInteger(result + "")) {BigDecimal bigDecimal = new BigDecimal(result + "");result = bigDecimal.setScale(getToFixed(toFixed), BigDecimal.ROUND_HALF_UP).toPlainString();}} catch (ScriptException e) {System.out.println("报错公式====  " + str);e.printStackTrace();}return isNumber(result + "");}private static int getToFixed(Object obj) {int fixed = 2;try {fixed = Integer.parseInt(obj + "");} catch (Exception e) {}return fixed;}/*** 是否是数字** @param num* @return*/public static String isNumber(String num) {if (isInteger(num)) {if (MyMath.test2(num + "==0")) return "0";return num;}return "0";}/*** 判断是否是计算数据类型** @param obj* @return*/public static boolean isInteger(Object obj) {String str = obj + "";return match("^(-)?[0-9]+(\\.[0-9]+)?$", str);}/*** 是否有小数点** @param str* @return*/public static boolean isHavaFixed(String str) {return str.contains(".");}/*** @param regex 正则表达式字符串* @param str   要匹配的字符串* @return 如果str 符合 regex的正则表达式格式,返回true, 否则返回 false;*/public static boolean match(String regex, String str) {Pattern pattern = Pattern.compile(regex);Matcher matcher = pattern.matcher(str);return matcher.matches();}/*** 数据计算指定格式** @param str  计算公式* @param form 指定格式* @return*/public static String endMath(String str, String form) {str = str.replaceAll("null", "0");if (VerifyUtil.isEmpty(str)) return "0";str = str.replace("--", "+");Object result = 0;try {result = engine.eval(str);DecimalFormat decimalFormat = new DecimalFormat(form);//防止科学计算result = decimalFormat.format(result);} catch (ScriptException e) {System.out.println("报错公式====  " + str);e.printStackTrace();}return isNumber(result + "");}/*** @param input* @return 判断是否是使用科学计数法的数字字符串*/public static boolean getScientific(String input) {String regx = "^((-?\\d+.?\\d*)[Ee]{1}(-?\\d+))$";//科学计数法正则表达式Pattern pattern = Pattern.compile(regx);return pattern.matcher(input).matches();}/*** 公式占比* ("Math.abs(%s-%s)<=10:10,Math.abs(%s-%s)<=15:5",  "10","20");** @param math* @return*/public static String getScore(String math, String... values) {String score = "0";String[] split = math.split(",");for (String s : split) {String itemMath = String.format(s, values);String[] split1 = itemMath.split(":");if (MyMath.test2(split1[0])) {score = split1[1];return score;}}return score;}/*** 结果计算,带权重* ("Math.abs(%s-%s)<=10:10,Math.abs(%s-%s)<=15:5", 10, "10","20");** @param math* @return*/public static String getScore(String math, Object weight, String... values) {String score = "0";String[] split = math.split(",");for (String s : split) {String itemMath = String.format(s, values);String[] split1 = itemMath.split(":");if (MyMath.test2(split1[0])) {score = split1[1];score = MyMath.test(score + "*" + weight);return score;}}return score;}/*** 将值填入数据** @param from* @param param* @return*/public static String getFromByKeys(String from, Map<String, Object> param) {String keysEnd = "[%s]";String keysRe = "\\[%s\\]";Set<String> keys = param.keySet();for (String key : keys) {String value = param.get(key) + "";String formatKey = String.format(keysEnd, key);if (from.indexOf(formatKey) > -1) {from = from.replaceAll(String.format(keysRe, key), value);}}return from;}public static void main(String[] args) {Map<String, Object> map = new HashMap<>();map.put("a", 1);map.put("cost", 3);map.put("num", 3);System.out.println(mathKeysName("[a]*[num]*[num]-[cost]+10", "4", map));}static String mathKeyRey = "\\[.*?\\]";public static String alias = ">.*";/*** 单数据计算* <p>* 公式用key   cost+num/a** @param funParam 函数参数,计算的值* @param anInt    保留小数点* @param baseMap  baseMap数据* @return*/public static String mathKeysName(String funParam, String anInt, Map<String, Object> baseMap) {if (VerifyUtil.isEmpty(funParam)) return "0";String formItem = funParam;//内变量List<String> strings = VerifyUtil.matchfindGroups(mathKeyRey, formItem);for (String string : strings) {String s1 = string.replaceAll("\\[", "");s1 = s1.replaceAll("\\]", "");String s2 = getKeysRegObje(baseMap, s1) + "";formItem = formItem.replaceAll(string.replace("[", "\\[").replace("]", "\\]"), s2);}String value = "0";value = MyMath.testToFixed(formItem, anInt);return value;}/*** 多层次获取对象** @param baseMap* @param s* @return*/public static Object getKeysRegObje(Map<String, Object> baseMap, String s) {if (VerifyUtil.isEmpty(s)) return null;String keys = s.replaceAll(alias, "");
//        String dataKey = s.replaceAll(path, "");String[] itemKeys = keys.split("\\.");Object obj = ParamDataUtils.getMapKeyBytoObjectNotMap(baseMap, itemKeys);return obj;}public static class MathException extends Exception {String excMath;public MathException() {}public MathException(String excMath) {this.excMath = excMath;}public String getExcMath() {return excMath;}public void setExcMath(String excMath) {this.excMath = excMath;}}}

tim工具包-MyMath 计算工具相关推荐

  1. tim工具包-task 定时任务调度中心 分布式可配置v1.5.0版本

    相关文章: tim工具包-dao层查询工具 tim工具包-sql管理平台-admin tim工具包-自动生成api接口 tim工具包-MyMath牛逼的计算工具 tim工具包-数据处理工具 v1.2 ...

  2. tim工具包-task 定时任务调度中心 分布式可配置v1.3.0版本

    相关文章: tim工具包-dao层查询工具 tim工具包-sql管理平台-admin tim工具包-自动生成api接口 tim工具包-MyMath牛逼的计算工具 tim工具包-数据处理工具 v1.2 ...

  3. tim工具包-RegHelper 智能清洗库

    相关文章: tim工具包-dao层查询工具 tim工具包-sql管理平台-admin tim工具包-自动生成api接口 tim工具包-MyMath牛逼的计算工具 tim工具包-数据处理工具 RegHe ...

  4. tim工具包-sql管理平台-admin

    相关文章: tim工具包-dao层查询工具 tim工具包-sql管理平台-admin tim工具包-自动生成api接口 tim工具包-MyMath牛逼的计算工具 tim工具包-数据处理工具 admin ...

  5. 科学计算工具NumPy(1):ndarray的创建于数据类型

    科学计算工具NumPy(1):ndarray的创建于数据类型 科学计算工具NumPy(2):ndarray的矩阵处理 科学计算工具NumPy(3):ndarray的元素处理 Numpy(Numeric ...

  6. python矩阵sin计算器_Python科学计算工具

    Python科学计算工具-Numpy入门 2017.07.02 20:29:14字数 1,404阅读 2,509 一:前言 学了中国大学mooc的Python数据分析与展示课程感觉挺不错的,记录下来以 ...

  7. 科学计算工具NumPy(3):ndarray的元素处理

    科学计算工具NumPy(1):ndarray的创建于数据类型 科学计算工具NumPy(2):ndarray的矩阵处理 科学计算工具NumPy(3):ndarray的元素处理 元素计算函数 ceil() ...

  8. 科学计算工具NumPy(2):ndarray的矩阵处理

    科学计算工具NumPy(1):ndarray的创建于数据类型 科学计算工具NumPy(2):ndarray的矩阵处理 科学计算工具NumPy(3):ndarray的元素处理 ndarray的矩阵运算 ...

  9. 函数计算工具链新成员 —— Fun Local 发布啦

    刚刚,我们发布了函数计算工具链的新成员,Fun Local.欢迎大家使用! 如果你还不了解 Fun 是什么,我们来简单解释下. Fun 是什么 Fun 是 have Fun with Serverle ...

最新文章

  1. R语言使用caretEnsemble包的caretStack函数把多个机器学习模型融合成一个模型、构建融合(集成)预测模型、使用融合模型进行预测推理
  2. 寻找冬日里的流量美食,发现了李子柒走红的秘密
  3. IDM——服务器响应显示您没有权限下载此文件(百度网盘下载问题)
  4. 暴走英雄坛html5游戏在线玩,暴走英雄坛h5
  5. iOS 文字转化成图片
  6. C++基类与派生类的转换与多态性
  7. 中断按键c语言程序设计,单片机C语言代码:外部中断,按下中断按键LED不亮,LED1正常亮...
  8. quill鼠标悬浮 出现提示_jQuery实现鼠标悬停显示提示信息窗口的方法
  9. 源码:Hadoop-3.0.3 启动过程中执行start-all.sh开始
  10. Broadcast variabies-广播变量
  11. Android 关于java.util.NoSuchElementException错误
  12. AWS API Gateway Swagger定义
  13. 【月径流预测】基于matlab未来搜索算法算法优化BP神经网络月径流预测【含Matlab源码 2001期】
  14. 李航《统计学习方法》多项式函数拟合问题--最小二乘法
  15. 【C++】1079:计算分数加减表达式的值(信息学奥赛)
  16. 独到科技CEO:十年扎根社交数据,用AI技术帮助企业更好服务消费者
  17. hyperic hq笔记
  18. Ubantu18.04上配置cuda10.0和cudnn
  19. 字节跳动最爱考的前端面试题:Node.js 基础
  20. PE文件-PE文件格式

热门文章

  1. 2022 华为OD机试真题 Python 实现【竖直四子棋】
  2. 仿抖音短视频系统源码,获取系统图片
  3. 用Lex编写的简易版C语言词法分析器(编译原理大作业1)
  4. shiro权限管理框架简介(一)
  5. 2022年全球与中国PERC电池市场现状及未来发展趋势
  6. 真正统治世界的十大算法(转)
  7. pdf拆分-PyPDF2
  8. unix系统之acct()
  9. 自定义布局Dialog 自定义dialog右上角带叉号的dialog 点击右上角叉号关闭dialog
  10. 9.14linux4个实验