我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java如何计算数学表达式

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java如何计算数学表达式

这篇文章主要为大家展示了“Java如何计算数学表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何计算数学表达式”这篇文章吧。

Java字符串转换成算术表达式计算并输出结果,通过这个工具可以直接对字符串形式的算术表达式进行运算,并且使用非常简单。

这个工具中包含两个类 Calculator 和 ArithHelper

Calculator 代码如下:

import java.util.Collections;import java.util.Stack;public class Calculator {private Stack<String> postfixStack = new Stack<String>();// 后缀式栈private Stack<Character> opStack = new Stack<Character>();// 运算符栈private int[] operatPriority = new int[] { 0, 3, 2, 1, -1, 1, 0, 2 };// 运用运算符ASCII码-40做索引的运算符优先级public static double conversion(String expression) {double result = 0;Calculator cal = new Calculator();try {expression = transform(expression);result = cal.calculate(expression);}catch (Exception e) {// e.printStackTrace();// 运算错误返回NaNreturn 0.0 / 0.0;}// return new String().valueOf(result);return result;}private static String transform(String expression) {char[] arr = expression.toCharArray();for (int i = 0; i < arr.length; i++) {if (arr[i] == '-') {if (i == 0) {arr[i] = '~';} else {char c = arr[i - 1];if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == 'E' || c == 'e') {arr[i] = '~';}}}}if(arr[0]=='~'||arr[1]=='('){arr[0]='-';return "0"+new String(arr);} else{return new String(arr);}}public double calculate(String expression) {Stack<String> resultStack = new Stack<String>();prepare(expression);Collections.reverse(postfixStack);// 将后缀式栈反转String firstValue, secondValue, currentValue;// 参与计算的第一个值,第二个值和算术运算符while (!postfixStack.isEmpty()) {currentValue = postfixStack.pop();if (!isOperator(currentValue.charAt(0))) {// 如果不是运算符则存入操作数栈中currentValue = currentValue.replace("~", "-");resultStack.push(currentValue);} else {// 如果是运算符则从操作数栈中取两个值和该数值一起参与运算secondValue = resultStack.pop();firstValue = resultStack.pop();// 将负数标记符改为负号firstValue = firstValue.replace("~", "-");secondValue = secondValue.replace("~", "-");String tempResult = calculate(firstValue, secondValue, currentValue.charAt(0));resultStack.push(tempResult);}}return double.valueOf(resultStack.pop());}private void prepare(String expression) {opStack.push(',');// 运算符放入栈底元素逗号,此符号优先级最低char[] arr = expression.toCharArray();int currentIndex = 0;// 当前字符的位置int count = 0;// 上次算术运算符到本次算术运算符的字符的长度便于或者之间的数值char currentOp, peekOp;// 当前操作符和栈顶操作符for (int i = 0; i < arr.length; i++) {currentOp = arr[i];if (isOperator(currentOp)) {// 如果当前字符是运算符if (count > 0) {postfixStack.push(new String(arr, currentIndex, count));// 取两个运算符之间的数字}peekOp = opStack.peek();if (currentOp == ')') {// 遇到反括号则将运算符栈中的元素移除到后缀式栈中直到遇到左括号while (opStack.peek() != '(') {postfixStack.push(String.valueOf(opStack.pop()));}opStack.pop();} else {while (currentOp != '(' && peekOp != ',' && compare(currentOp, peekOp)) {postfixStack.push(String.valueOf(opStack.pop()));peekOp = opStack.peek();}opStack.push(currentOp);}count = 0;currentIndex = i + 1;} else {count++;}}if (count > 1 || (count == 1 && !isOperator(arr[currentIndex]))) {// 最后一个字符不是括号或者其他运算符的则加入后缀式栈中postfixStack.push(new String(arr, currentIndex, count));}while (opStack.peek() != ',') {postfixStack.push(String.valueOf(opStack.pop()));// 将操作符栈中的剩余的元素添加到后缀式栈中}}private Boolean isOperator(char c) {return c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')';}public Boolean compare(char cur, char peek) {// 如果是peek优先级高于cur,返回true,默认都是peek优先级要低Boolean result = false;if (operatPriority[(peek) - 40] >= operatPriority[(cur) - 40]) {result = true;}return result;}private String calculate(String firstValue, String secondValue, char currentOp) {String result = "";switch (currentOp) {case '+':      result = String.valueOf(ArithHelper.add(firstValue, secondValue));break;case '-':      result = String.valueOf(ArithHelper.sub(firstValue, secondValue));break;case '*':      result = String.valueOf(ArithHelper.mul(firstValue, secondValue));break;case '/':      result = String.valueOf(ArithHelper.div(firstValue, secondValue));break;}return result;}}

ArithHelper 代码如下:

public class ArithHelper {// 默认除法运算精度private static final int DEF_DIV_SCALE = 16;// 这个类不能实例化private ArithHelper() {}public static double add(double v1, double v2) {java.math.BigDecimal b1 = new java.math.BigDecimal(double.toString(v1));java.math.BigDecimal b2 = new java.math.BigDecimal(double.toString(v2));return b1.add(b2).doubleValue();}public static double add(String v1, String v2) {java.math.BigDecimal b1 = new java.math.BigDecimal(v1);java.math.BigDecimal b2 = new java.math.BigDecimal(v2);return b1.add(b2).doubleValue();}public static double sub(double v1, double v2) {java.math.BigDecimal b1 = new java.math.BigDecimal(double.toString(v1));java.math.BigDecimal b2 = new java.math.BigDecimal(double.toString(v2));return b1.subtract(b2).doubleValue();}public static double sub(String v1, String v2) {java.math.BigDecimal b1 = new java.math.BigDecimal(v1);java.math.BigDecimal b2 = new java.math.BigDecimal(v2);return b1.subtract(b2).doubleValue();}public static double mul(double v1, double v2) {java.math.BigDecimal b1 = new java.math.BigDecimal(double.toString(v1));java.math.BigDecimal b2 = new java.math.BigDecimal(double.toString(v2));return b1.multiply(b2).doubleValue();}public static double mul(String v1, String v2) {java.math.BigDecimal b1 = new java.math.BigDecimal(v1);java.math.BigDecimal b2 = new java.math.BigDecimal(v2);return b1.multiply(b2).doubleValue();}public static double div(double v1, double v2) {return div(v1, v2, DEF_DIV_SCALE);}public static double div(String v1, String v2) {java.math.BigDecimal b1 = new java.math.BigDecimal(v1);java.math.BigDecimal b2 = new java.math.BigDecimal(v2);return b1.divide(b2, DEF_DIV_SCALE, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();}public static double div(double v1, double v2, int scale) {if (scale < 0) {throw new IllegalArgumentException("The  scale  must  be  a  positive  integer  or  zero");}java.math.BigDecimal b1 = new java.math.BigDecimal(double.toString(v1));java.math.BigDecimal b2 = new java.math.BigDecimal(double.toString(v2));return b1.divide(b2, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();}public static double round(double v, int scale) {if (scale < 0) {throw new IllegalArgumentException("The  scale  must  be  a  positive  integer  or  zero");}java.math.BigDecimal b = new java.math.BigDecimal(double.toString(v));java.math.BigDecimal one = new java.math.BigDecimal("1");return b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();}public static double round(String v, int scale) {if (scale < 0) {throw new IllegalArgumentException("The  scale  must  be  a  positive  integer  or  zero");}java.math.BigDecimal b = new java.math.BigDecimal(v);java.math.BigDecimal one = new java.math.BigDecimal("1");return b.divide(one, scale, java.math.BigDecimal.ROUND_HALF_UP).doubleValue();}}

使用时调用 Calculator 类的 conversion()方法,并传入算术表达式参数,即可返回一个 Double 类型的值。

使用示例:

public class MathTest {public static void main(String[] args) {String expression = "(0*1--3)-5/-4-(3*(-2.13))";double result = Calculator.conversion(expression);System.out.println(expression + " = " + result);System.out.println();}}

控制台输出:

(0*1--3)-5/-4-(3*(-2.13)) = 10.64

测试截图:

Java如何计算数学表达式

以上是“Java如何计算数学表达式”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java如何计算数学表达式

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java如何计算数学表达式

这篇文章主要为大家展示了“Java如何计算数学表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何计算数学表达式”这篇文章吧。Java字符串转换成算术表达式计算并输出结果,通过这个工
2023-05-30

JAVA中如何实现表达式计算源码

这篇文章主要为大家展示了“JAVA中如何实现表达式计算源码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JAVA中如何实现表达式计算源码”这篇文章吧。支持运算符:+-*/%><][!|&=;其中
2023-06-03

C语言如何实现数学表达式运算

C语言如何实现数学表达式运算,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。大家分享了C语言实现数学表达式运算的具体代码,具体内容如下1、开发思路: (假设有表达式 2 *
2023-06-21

如果 NULLIF() 中的参数不相等,MySQL 如何计算表达式?

我们知道 MySQL NULLIF() 控制流函数将返回第一个参数,这两个参数不相同。返回第一个参数,因为如果两个参数不相同,MySQL 会计算第一个参数两次。示例mysql> Select NULLIF(Tutorialspoint,My
2023-10-22

java怎么计算字符串表达式的值

在Java中,你可以使用ScriptEngine类来计算字符串表达式的值。下面是一个简单的例子:import javax.script.ScriptEngine;import javax.script.ScriptEngineManag
2023-10-23

java如何提取表达式

这篇文章主要为大家展示了“java如何提取表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何提取表达式”这篇文章吧。提取表达式在软件开发过程中,程序员很容易有意无意让代码做一些“重
2023-06-27

java如何实现OA信用盘系统制作字符串表达式计算

这篇文章将为大家详细讲解有关java如何实现OA信用盘系统制作字符串表达式计算,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。方案一:eval 函数OA信用盘系统制作q<115.28.8.00.9.9>ev
2023-06-02

Java的Lambda表达式如何使用

这篇文章主要介绍“Java的Lambda表达式如何使用”,在日常操作中,相信很多人在Java的Lambda表达式如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的Lambda表达式如何使用”的疑
2023-06-30

java如何使用正则表达式

Java中使用正则表达式需要使用java.util.regex包中的相关类和方法。以下是使用正则表达式的基本步骤:1. 创建正则表达式:使用字符串表示正则表达式,可以使用特殊字符和符号来定义匹配规则。2. 编译正则表达式:使用Pattern
2023-09-26

后缀表达式的java如何实现

这篇“后缀表达式的java如何实现”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“后缀表达式的java如何实现”文章吧。中缀表
2023-07-02

lambda表达式如何在java中使用

这篇文章给大家介绍lambda表达式如何在java中使用,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Lamda表达式λ 希腊字母表中排序第十一位字母,英语名称为Lambda避免匿名内部类定义过多其实质属于函数式 编程
2023-06-14

如何理解Java中的lambda表达式

这篇文章主要介绍了如何理解Java中的lambda表达式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何理解Java中的lambda表达式文章都会有所收获,下面我们一起来看看吧。Lambda概述Lambda表
2023-06-30

EL表达式如何在JAVA中使用

这篇文章将为大家详细讲解有关EL表达式如何在JAVA中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。一、概念表达式语言(Expression Language),或称EL表达式,简称EL
2023-05-31

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录