Строки Java преобразуются в арифметические выражения для расчета и вывода результатов. Этот инструмент может напрямую рассчитывать арифметические выражения в форме строк, и он очень прост в использовании.
Этот инструмент содержит калькулятор двух классов и арифхелпер
Код калькулятора выглядит следующим образом:
import java.util.collections; import java.util.stack;/*** Оценка арифметического выражения* Преобразование метода класса калькулятора непосредственно вызовит ()* Пропуск арифметического выражения вернет результат с плавающей точкой*, если процесс расчета неверный, NAN будет возвращен*/Public Class Calculator {Private PostFixckscstack = stack stachix =);//pertain clasculator {Private PostFixck = new Stack =) (/////еджийский стек. Stack<Character> opStack = new Stack<Character>();// Operator stack private int[] operatorPriority = new int[] { 0, 3, 2, 1, -1, 1, 0, 2 };// Operator priority using operator ASCII code-40 for indexing 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;} // возвращать new String (). ValueOf (result); возврат результат;}/ *** Изменение символа отрицательных чисел в выражении* @param* Например -2+-1* (-3E-2)-1)-1)-1)- ~ 2+~ 1 *(~ 3e ~ 2)-(~ 1) *@return */private static String transform (string Expression) {char [] arr = Express.tochararray (); for (int i = 0; i <arr.length; i ++) {if (arr [i] == '-') {if (i = 0) {arr] = '~'; (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == 'e' || c == 'e') {arr [i] = '~';}}}} if (arr [0] == '~' || arr [1] == '(')} if (arr [0] = '~' || String (arr);} else {return new String (arr);}}/** * Рассчитайте в соответствии с данным выражением * * @param выражение * FirstValue, SecondValue, CurrentValue; // Первое значение, SecondValue, CurrentValue; // Первое значение, второе значение и оператор арифметического оператора, участвующего в расчете, когда (! PostFixStack.isempty ()) {currentValue = postfixStack.pop (); if (! Isoperator (CurrentValue.CHARAT). В стеке операндов CurrentValue = currentValue.replace ("~", "-"); resultStack.push (currentValue);} else {// Если это оператор, возьмите два значения из стека операнда и участвуйте в операции вместе со значением secondValue = resultStack.pop (); FirstValU FirstValue.Replace ("~", "-"); SecondValue = SecondValue.Replace ("~", "-"); String Tempresult = Calculate (FirstValue, SecondValue, CurrentValue.Charat (0)); ResultStack.push (Tempresult);}} return double.value (resultStack.pop (tempresult);}} return.valueOf (resultStack. преобразует выражение в стек суффиксов * * * @param выражение */private void Prepare (String Expression) {opstack.push (','); // Оператор помещает запятую в нижний элемент стека, и этот символ имеет самый низкий приоритет char [] arr = expression.tochararray (); int currentIndex = 0; // Современный характер. Этот арифметический оператор является удобным или численным CHAR CurrentOP, Peekop; // текущий оператор и оператор верхнего стека для (int i = 0; i <arr.length; i ++) {currentop = arr [i]; if (isoperator (currentop)) {// Если текущий символ является оператором, если (count> 0) {postfixStack.push (restex/ countex/ countex/ countex/ countex/ countex; Число между двумя операторами} peekop = opstack.peek (); if (currentop == ')') {// При столкновении с Unbranch удалите элемент в стеке операторов в стек суффиксов, пока не столкнется первой кронштейн (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]))) {// Если последний символ не является скобком или другим оператором, добавьте его в aust stock -stack.p.pe.pe.pe.pe.pe.pe.p. CurrentIndex, count));} while (Opstack.peek ()! = ',') {postfixStack.push (string.valueof (opstack.pop ())); // Добавить оставшиеся элементы в стек операторов в стек суффикс}/** * Определить, является ли это арифметический символ * * @param c * @return * @return * @return * @return * @return * @return * @return * @@return * @return * @@return * @@return * @@return * @@return * @@return * @@return * @retur C == '+' || C == '-' || C == ' *' || C == '/' || C == '(' || C == ') cur, вернуть True, приоритет Peek по умолчанию - более низкий логический результат = false; 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, secondulue); String.valueof (arithhelper.mul (firstvalue, secondvalue)); break; case '/': result = string.valueof (arithhelper.div (firstvalue, secondvalue)); break;} return -результат;}}Код арифхелпера выглядит следующим образом:
Общедоступный класс arithhelper {// Точность работы по умолчанию. * * @param v1 добавлен * @param v2 add * @return сумма двух параметров */public static double add (double v1, double v2) {java.math.bigdecimal b1 = new java.math.bigdecimal (Double.ToString (v1); java.math.bigdecimal (double.tostring (v2)); return b1.add (b2) .doublevalue ();} public static double double (String v1, String v2) {java.math.bigdecimal b1 = new java.math.bigdecimal (v1); java.math.bigdecimal (v2); return b1.add (b2) .doublevalue ();}/*** обеспечивает точные операции вычитания. ** @param v1 вычтите* @param v2 выброс* @return 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 (v2); return b1.subtract (b2) .doublevalue ();}/*** обеспечивает точные операции умножения. * * @param v1 * Multiplier * @param v2 * Multiplier * @return Product из двух параметров */public static double mul (double v1, double v2) {java.math.bigdecimal b1 = new java.math.bigdecimal (double.toString (v1); 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); new java.math.bigdecimal (v2); return b1.multiply (b2) .doublevalue ();}/*** обеспечивает (относительно) точную операцию деления. Когда нет деления, оно точнее до 10 цифр после десятичной точки, а последующие числа закруглены. * * @param v1 * divider * @param v2 * divider * @return quotation двух параметров */public static double div (двойной v1, двойной v2) {return div (v1, v2, def_div_scale);} public static double div (строка 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) .doubleval. Операция разделения. Когда нет конца для завершения разделения, точность определяется параметрам масштаба, а последующие числа округлены. ** @param v1 разделитель* @param v2 -делитель* @param Scale означает, что он должен быть точным до нескольких цифр после десятичной точки. * @return Covertient двух параметров*/public static double div (double v1, double v2, int scale) {if (scale <0) {throw new allogalargumentException («Шкала должна быть положительным целым целом или ноль»);} java.math.bigdecimal b1 = новое java.math.bigdecimal (double.tostring (v1)); java.math.bigdecimal b2 = new java.math.bigdecimal (Double.toString (v2)); возврат b1.divide (b2, Scale, java.math.bigdecimal.round_half_up) .doublevalue ();}/*** обеспечивает точное десятичное округление. ** @param v Подсчета, которые необходимо округлить* @param Scale, сколько цифр сохраняется после десятичной точки* @return Результат после округления*/public static double -раунд (двойной v, int scale) {if (scale <0) {throw new allodalargumentException («Шкала должна быть положительным или Zero»); java.math.bigdecimal (double.tostring (v); java.math.bigdecimal one = new java.math.bigdecimal ("1"); вернуть b.divide (один, Scale, java.math.bigdecimal.round_half_up). {if (Scale <0) {бросить новую allodalargumentException («Масштаб должен быть положительным целом или ноль»);} java.math.bigdecimal b = new java.math.bigdecimal (v); java.math.bigdecimal One = new java.math.bigdecimal (1 »(1,1divecimal One = new java.math.bigdecimal (1, java.math.bigdecimal.round_half_up) .doublevalue ();}}При его использовании вызовите метод Conversion () класса калькулятора и передайте параметр арифметического выражения, чтобы вернуть значение типа двойного.
Пример использования:
открытый класс MathTest {public static void main (string [] args) {string Expression = "(0*1--3) -5/-4- (3*(-2,13))"; двойной результат = калькулятор.conversion (Expression); System.out.println (Expression + "=" + Result); System.out.println ();}}}}}}}}}}}Вывод консоли:
(0*1--3) -5/-4- (3*(-2,13)) = 10,64
Тестовый скриншот:
Суммировать
Выше всего подробное объяснение кода вычислительного математического выражения Java, я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!