JAVA数学区间计算,支持开闭区间、百分比、-∞、+∞

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import java.math.BigDecimal;
import java.math.RoundingMode;/*** 判断数值是否在数学区间范围内** @author AnNong* @date 2023-04-07*/
public class IntervalUtil {public static ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");/*** @Description: 比较dataValue与interval结果* @Param: [dataValue:比较值, interval:如 ≤0、≥0 、>0 、<0 、==0]* @return: boolean*/public static boolean compareNumValue(String dataValue, String interval) {//转换比较符号≤转换为<=,≥转换为>=String comparator = interval.replace("≤", "<=").replace("≥", ">=");//拼接表达式StringBuffer formula = new StringBuffer();formula.append("(");formula.append(dataValue);formula.append(comparator);formula.append(")");try {//计算表达式return (Boolean) jse.eval(formula.toString());} catch (Exception t) {return false;}}/*** 根据数学表达式计算结果** @param expression 表达式, 70/(1.73*1.73)* @param scala      四舍五入保留几位小数* @return*/public static String calcValue(String expression, int scala) {try {//计算表达式Object eval = jse.eval(expression);if (scala != 0) {BigDecimal result = new BigDecimal(eval.toString());result = result.setScale(2, RoundingMode.HALF_UP);return result.toString();}return String.valueOf(eval);} catch (Exception t) {return "";}}/*** 判断data_value是否在interval区间范围内** @param data_value 数值类型的* @param interval   正常的数学区间,包括无穷大等,如:(1,3)、>5%、(-∞,6]、(125%,135%)U(70%,80%)* @return true:表示data_value在区间interval范围内,false:表示data_value不在区间interval范围内*/public static boolean isInTheInterval(String data_value, String interval) {//将区间和data_value转化为可计算的表达式String formula = getFormulaByAllInterval(data_value, interval, "||");ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");try {//计算表达式return (Boolean) jse.eval(formula);} catch (Exception t) {return false;}}/*** 将所有阀值区间转化为公式:如* [75,80)   =》        date_value < 80 && date_value >= 75* (125%,135%)U(70%,80%)   =》        (date_value < 1.35 && date_value > 1.25) || (date_value < 0.8 && date_value > 0.7)** @param date_value* @param interval   形式如:(125%,135%)U(70%,80%)* @param connector  连接符 如:") || ("*/private static String getFormulaByAllInterval(String date_value, String interval, String connector) {StringBuffer buff = new StringBuffer();for (String limit : interval.split("U")) {//如:(125%,135%)U (70%,80%)buff.append("(").append(getFormulaByInterval(date_value, limit, " && ")).append(")").append(connector);}String allLimitInvel = buff.toString();int index = allLimitInvel.lastIndexOf(connector);allLimitInvel = allLimitInvel.substring(0, index);return allLimitInvel;}/*** 将整个阀值区间转化为公式:如* 145)      =》         date_value < 145* [75,80)   =》        date_value < 80 && date_value >= 75** @param date_value* @param interval   形式如:145)、[75,80)* @param connector  连接符 如:&&*/private static String getFormulaByInterval(String date_value, String interval, String connector) {StringBuffer buff = new StringBuffer();for (String halfInterval : interval.split(",")) {//如:[75,80)、≥80buff.append(getFormulaByHalfInterval(halfInterval, date_value)).append(connector);}String limitInvel = buff.toString();int index = limitInvel.lastIndexOf(connector);limitInvel = limitInvel.substring(0, index);return limitInvel;}/*** 将半个阀值区间转化为公式:如* 145)      =》         date_value < 145* ≥80%      =》         date_value >= 0.8* [130      =》         date_value >= 130* <80%     =》         date_value < 0.8** @param halfInterval 形式如:145)、≥80%、[130、<80%* @param date_value* @return date_value < 145*/private static String getFormulaByHalfInterval(String halfInterval, String date_value) {halfInterval = halfInterval.trim();if (halfInterval.contains("∞")) {//包含无穷大则不需要公式return "1 == 1";}StringBuffer formula = new StringBuffer();String data = "";String opera = "";if (halfInterval.matches("^([<>≤≥\\[\\(]{1}(-?\\d+.?\\d*\\%?))$")) {//表示判断方向(如>)在前面 如:≥80%opera = halfInterval.substring(0, 1);data = halfInterval.substring(1);} else {//[130、145)opera = halfInterval.substring(halfInterval.length() - 1);data = halfInterval.substring(0, halfInterval.length() - 1);}double value = dealPercent(data);formula.append(date_value).append(" ").append(opera).append(" ").append(value);String a = formula.toString();//转化特定字符return a.replace("[", ">=").replace("(", ">").replace("]", "<=").replace(")", "<").replace("≤", "<=").replace("≥", ">=");}/*** 去除百分号,转为小数** @param str 可能含百分号的数字* @return*/private static double dealPercent(String str) {double d = 0.0;if (str.contains("%")) {str = str.substring(0, str.length() - 1);d = Double.parseDouble(str) / 100;} else {d = Double.parseDouble(str);}return d;}public static void main(String[] args) {// 年龄大于等于35岁或小于等于18岁
//        String c = "(-∞,18]U[35,+∞)";
//        System.out.println(isInTheInterval("36", c));
//        System.out.println(isInTheInterval("18", c));
//        System.out.println(isInTheInterval("17", c));ScriptEngine jse = new ScriptEngineManager().getEngineByName("JavaScript");try {//计算表达式String e = "70/(1.73*1.73)";System.out.println(jse.eval(e));} catch (Exception t) {t.printStackTrace();}
//
//
//        String d = "[40,+∞)";
//        System.out.println(isInTheInterval("40", c));
//        System.out.println(isInTheInterval("41", c));
//
//        //判断区间范围
//        System.out.println(isInTheInterval("2", "(1,3]"));//比较dataValue与interval结果}}

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

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

相关文章

前端生成pdf之html2canvas+jsPDF,以及解决图片不显示bug

前端如何生成pdf 开发背景&#xff1a; 需要给页面中相应的内容生成pdf&#xff0c;查找文档后发现要用到两个插件。html2canvas 以及 jsPDF html2canvas 给dom结构转化为canvas&#xff0c;然后生成各种类型图片jsPDF 把canvas 生成的图片url 转化为pdf // 插入图片 pdf.addI…

3.【CPP入门】(深浅拷贝||运算符重载||赋值运算符重载)

一.浅拷贝和深拷贝 1.引入 从上篇博客拷贝构造我们知道拷贝构造要传引用而不能传值&#xff0c;否则会发生无穷递归的情况。 1.若未显示定义拷贝构造函数&#xff0c;系统会生成默认的拷贝构造函数。默认的拷贝构造按内存序完成拷贝&#xff0c;我们称之为浅拷贝&#xff08;…

python中迭代器的应用

迭代器&#xff08;Iterator&#xff09;在Python中是一种用于迭代访问元素的对象&#xff0c;它提供了一种统一的访问集合元素的方式。迭代器通常与可迭代对象&#xff08;Iterable&#xff09;一起使用&#xff0c;如列表、元组、字典等。以下是迭代器在Python中的应用场景&a…

开机自启动app

问&#xff1a;在android系统的tv上&#xff0c;用遥控器可以控制光标位置&#xff0c;这是不是有一些监听事件实现的&#xff0c;具体原理是什么 答&#xff1a; 在 Android TV 上&#xff0c;使用遥控器来控制光标位置的功能是通过处理按键事件和焦点控制来实现的。 Andro…

「许战海矩阵战略洞察」从“老干妈”看全国辣椒酱企业的发展战略

引言&#xff1a;老干妈作为辣椒酱行业的领导品牌&#xff0c;虽然市场份额大&#xff0c;但增长缓慢。本文分析了老干妈的成功秘诀和增长挑战&#xff0c;提出了建立组合信任、强化渠道管控和打造第二招牌产品的战略建议。同时&#xff0c;给我国辣椒酱企业提供了佐餐酱和烹饪…

Android Studio安卓读写NFC Ntag标签源码

本示例使用的发卡器&#xff1a; https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-21818769070.11.3513789erHXVGx&id615391857885 <?xml version"1.0" encoding"utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout x…

边缘计算的舞台,挑战与机遇相伴

目录 前言 边缘计算保卫战&#xff1a;数据宝藏的隐藏与探索 稳如磐石&#xff1a;保障你的边缘计算宝藏安稳运行&#xff01; 打破时间的桎梏&#xff1a;为边缘计算注入超快速度与实时表演 边缘计算&#xff1a;应对多样性和异构性的酷炫策略大揭秘 边缘计算&#xff1a;释…

中间件:构建现代软件架构的桥梁

一、前言 在当今快速发展的科技领域中&#xff0c;软件系统的复杂性不断增加。为了应对这一挑战&#xff0c;中间件应运而生&#xff0c;成为连接和协调不同软件组件的不可或缺的桥梁。本文将深入探讨中间件的基本概念、作用以及一些常见的中间件类型。 二、中间件的定义 中间…

C#实现Excel合并单元格数据导入数据集

目录 功能需求 Excel与DataSet的映射关系 范例运行环境 Excel DCOM 配置 设计实现 组件库引入 ​方法设计 返回值 参数设计 打开数据源并计算Sheets 拆分合并的单元格 创建DataTable 将单元格数据写入DataTable 总结 功能需求 将Excel里的worksheet表格导入到Da…

02.阿里Java开发手册——日期时间

【强制】日期格式化时&#xff0c;传入 pattern 中表示年份统一使用小写的 y。 说明&#xff1a;日期格式化时&#xff0c;yyyy 表示当天所在的年&#xff0c;而大写的 YYYY 代表是 week in which year&#xff08;JDK7 之后引入的概念&#xff09;&#xff0c;意思是当天所在的…

2023年全国职业院校技能大赛软件测试赛题—单元测试卷④

任务二 单元测试 一、任务要求 题目1&#xff1a;根据下列流程图编写程序实现相应分析处理并显示结果。返回结果“ax&#xff1a;”&#xff08;x为2、3或4&#xff09;&#xff1b;其中变量x、y均须为整型。编写程序代码&#xff0c;使用JUnit框架编写测试类对编写的程序代码…

通义千问AI挑战赛赛后反思

个人理解&#xff1a; 初赛阶段主要聚焦在如何通过 SFT 提升基础模型的代码能力&#xff0c;需要选手基于最新开源的 Qwen 1.8 模型作为基础模型&#xff0c;上分的关键主要通过收集高质量的代码数据提升模型的在Python, JavaScript, Java, Go, C, Rust六种编程语言的代码生成…

Echarts封装动态加载组件,并且添加循环效果

基于 Echarts 框架的组件&#xff0c;用于实现数据滚动效果。在该组件中&#xff0c;我们首先引入了 Echarts 库&#xff0c;并定义了组件的名称和所需的 props 属性。在 mounted 钩子函数中&#xff0c;我们调用 initChart 方法来初始化图表&#xff0c;并使用 setInterval 定…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS依托统计学处理数据的应用场景

《SPSS统计学基础与实证研究应用精解》1.4 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解1.4节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手教会使…

肝了半个月的学习路线终于上线了,升职加薪,轻松拿捏!

大家好&#xff0c;我是冰河~~ 最近有不少小伙伴问我出去面试找一份好工作要学习哪些知识和技术&#xff0c;有没有什么好的学习路线&#xff0c;这不&#xff0c;我连夜肝了这份Java完整高清学习路线。 学习路线 完整路线 这份Java完整高清学习路线的总体路线图如下所示。…

微信小程序开发学习笔记《7》全局配置以及小程序窗口

微信小程序开发学习笔记《7》全局配置以及小程序窗口 博主正在学习微信小程序开发&#xff0c;希望记录自己学习过程同时与广大网友共同学习讨论。全局配置官方文档 一、全局配置文件及常用的配置项 小程序根目录下的app.json 文件是小程序的全局配置文件。 常用的配置项如…

Redis的实现三:c语言实现平衡二叉树,通过平衡二叉树实现排序集

概况&#xff1a;Redis中的排序集数据结构是相当复杂的独特而有用的东西。它不仅提供了顺序排序数据的能力&#xff0c;而且具有按排名查询有序数据的独特特性。 Redis中的排序集 &#xff08;Sorted Set&#xff09;是一种特殊的数据结构&#xff0c;它结合了集合&#xff0…

C //练习 4-14 定义宏swap(t, x, y)以交换t类型的两个参数。(使用程序块结构会对你有所帮助。)

C程序设计语言 &#xff08;第二版&#xff09; 练习 4-14 练习 4-14 定义宏swap(t, x, y)以交换t类型的两个参数。&#xff08;使用程序块结构会对你有所帮助。&#xff09; 注意&#xff1a;代码在win32控制台运行&#xff0c;在不同的IDE环境下&#xff0c;有部分可能需要…

YOLOv7-tiny,通过pycocotools包得到预测大中小尺寸目标的指标值

文章目录 参考链接步骤认识正确的instances_val2017.json文件格式 代码&#xff08;mogui_tococo.py&#xff0c;用于我自己的数据集&#xff09; 参考链接 需要先在环境中安装pycocotools pip install pycocotools魔鬼面具的代码&#xff1a;objectdetection-tricks/tricks_…