iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Java如何计算数学表达式
  • 522
分享到

Java如何计算数学表达式

java 2023-05-30 18:05:38 522人浏览 独家记忆
摘要

这篇文章主要为大家展示了“Java如何计算数学表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何计算数学表达式”这篇文章吧。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如何计算数学表达式”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Java如何计算数学表达式

本文链接: https://www.lsjlt.com/news/220505.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • Java如何计算数学表达式
    这篇文章主要为大家展示了“Java如何计算数学表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Java如何计算数学表达式”这篇文章吧。Java字符串转换成算术表达式计算并输出结果,通过这个工...
    99+
    2023-05-30
    java
  • JAVA中如何实现表达式计算源码
    这篇文章主要为大家展示了“JAVA中如何实现表达式计算源码”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JAVA中如何实现表达式计算源码”这篇文章吧。支持运算符:+-*/%><][!...
    99+
    2023-06-03
  • Python eval 函数动态地计算数学表达式
    ​本文中,云朵君将和大家一起从如下两个方面展开学习。Python的eval()如何工作如何使用eval()来动态地计算任意基于字符串或基于编译代码的输入此外,后期推文将一起学习如何使用 Python 的 ​eval()​ 来编码一个交互式地...
    99+
    2023-05-14
    代码 Python 字符串
  • 利用Python+eval函数构建数学表达式计算器
    目录eval() 的安全问题限制globals和locals限制内置名称的使用限制输入中的名称将输入限制为只有字数使用eval()与input()函数构建一个数学表达式计算器总结Py...
    99+
    2024-04-02
  • C语言如何实现数学表达式运算
    C语言如何实现数学表达式运算,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。大家分享了C语言实现数学表达式运算的具体代码,具体内容如下开发思路: (假设有表达式 2 * 3 ...
    99+
    2023-06-21
  • Python+eval函数实现动态地计算数学表达式详解
    目录Python 的 eval()第一个参数:expression第二个参数:globals第三个参数:locals用 eval() 计算表达式布尔表达式数学表达式通用表达式Pyth...
    99+
    2024-04-02
  • C语言实现数学表达式运算
    本文实例为大家分享了C语言实现数学表达式运算的具体代码,供大家参考,具体内容如下 1、开发思路: (假设有表达式 2 * 3 * ( 1 + 2) ) 数字要一个一个取出放在内存中,...
    99+
    2024-04-02
  • java怎么计算字符串表达式的值
    在Java中,你可以使用ScriptEngine类来计算字符串表达式的值。下面是一个简单的例子: import javax.scri...
    99+
    2023-10-23
    java
  • 用 Go 实现一个完整的数学表达式计算引擎
    导读这篇文章将从头开始,使用 Go 语言来实现一个完整的数学表达式计算引擎。本文采用的是抽象语法树(Abstract Syntax Tree,AST)实现方式。虽然本文的实现代码为 Go,但不用纠结于此,语言只是实现方式的一种选择,作为开发...
    99+
    2024-04-02
  • 如果 NULLIF() 中的参数不相等,MySQL 如何计算表达式?
    我们知道 MySQL NULLIF() 控制流函数将返回第一个参数,这两个参数不相同。返回第一个参数,因为如果两个参数不相同,MySQL 会计算第一个参数两次。示例mysql> Select NULLIF('Tutorials...
    99+
    2023-10-22
  • Java实现简易计算器(逆波兰表达式)
    本文实例为大家分享了Java实现简易计算器的具体代码,供大家参考,具体内容如下 程序的运行环境为Windows10 ,编译环境为IDEA。 计算器有以下功能和要求:能够计算复杂表达式...
    99+
    2024-04-02
  • java如何提取表达式
    这篇文章主要为大家展示了“java如何提取表达式”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java如何提取表达式”这篇文章吧。提取表达式在软件开发过程中,程序员很容易有意无意让代码做一些“重...
    99+
    2023-06-27
  • java如何实现OA信用盘系统制作字符串表达式计算
    这篇文章将为大家详细讲解有关java如何实现OA信用盘系统制作字符串表达式计算,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。方案一:eval 函数OA信用盘系统制作q<115.28.8.00.9.9...
    99+
    2023-06-02
  • Java的Lambda表达式如何使用
    这篇文章主要介绍“Java的Lambda表达式如何使用”,在日常操作中,相信很多人在Java的Lambda表达式如何使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的Lambda表达式如何使用”的疑...
    99+
    2023-06-30
  • java如何使用正则表达式
    Java中使用正则表达式需要使用java.util.regex包中的相关类和方法。以下是使用正则表达式的基本步骤:1. 创建正则表达...
    99+
    2023-09-26
    java
  • python学习笔记-3运算符与表达式
    ①表达式:将不同的数据(包括函数,变量)用运算符按一定的规则联结起来的式子②运算符:算术运算符:+ 加法运算符-减法运算符*乘法运算符/除法运算符,整数与整数相除只能得出整数,若需得到小数部分,要在一个数中加上小数点后一位         ...
    99+
    2023-01-31
    表达式 学习笔记 运算符
  • java算术表达式求值怎么写
    要求解一个算术表达式的值,可以使用栈来实现。具体步骤如下: 创建两个栈,一个用于存储操作符(operatorStack),一个用于...
    99+
    2023-10-23
    java
  • java如何实现科学计算器
    这篇文章主要介绍了java如何实现科学计算器的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java如何实现科学计算器文章都会有所收获,下面我们一起来看看吧。实现思路通过点击按钮可以得到一个算术表达式,并且它是一...
    99+
    2023-07-02
  • C++实现LeetCode(150.计算逆波兰表达式)
    [LeetCode] 150.Evaluate Reverse Polish Notation 计算逆波兰表达式 Evaluate the value of an arithmeti...
    99+
    2024-04-02
  • Java中Cron表达式的生成解析和计算的工具类
    Java中Cron表达式的生成解析和计算的工具类 1. 生成表达式2. 解析表达式3. 计算表达式执行日期4. 测试5. 完整代码 本文介绍通过java生成cron表达式,解析表达式,...
    99+
    2023-10-03
    java python 算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作