Java 문자열은 산술 표현식으로 변환되어 결과를 계산하고 출력합니다. 이 도구는 문자열 형태의 산술 표현을 직접 계산할 수 있으며 사용하기가 매우 간단합니다.
이 도구에는 두 가지 클래스 계산기와 Arithhelper가 포함되어 있습니다
계산기 코드는 다음과 같습니다.
import java.util.collections; import java.util.stack;/*** 산술 표현식 평가* 직접 호출 계산기의 클래스 메소드 변환 ()* 산술 표현식으로 전달하면 부동 소수점 값 결과를 반환합니다. stack <ataintry> opstack = new Stack <atire> (); // 연산자 stack private int [] operatorPriority = new int [] {0, 3, 2, 2, 1, -1, 1, 0, 2}; // 연산자 ASCII Code -40을 사용한 연산자 우선 순위 공개 정적 이중 변환 (문자열 표현) {double result = 0; new expression ();); cal.calculate (expression);} catch (예외 e) {// e.printstacktrace (); // 작동 오류 반환 0.0/ 0.0;} // return new string (). valueof (결과); return result;}/ *** exprection** @param expression*에서 음수 숫자의 상징을 변경합니다. ~ 2+~ 1 *(~ 3e ~ 2)-(~ 1) *@return */private static String transform (string expression) {char [] arr = expression.toChararray (); for (int i = 0; i <arr.length; i ++) {if [i] == '-') {if (i == 0) {at [i] = '~' (c == '+'|| c == '-'|| c == '*'|| c == '/'|| c == '('|| c == 'e'|| c == 'e') {arr [i] = '~';}}} if (arr [0] == '~'|| arr [1] == '(') {0]. String (arr);} else {return new String (arr);}}/** * 주어진 표현식에 따라 계산 * * @param 표현 * 예를 들면 계산할 수있는 표현식 : 5+12 * (3+5)/7 * @return */public double calculation (String <string> resultstack = new Stack <string> (); Stack String FirstValue, SecondValue, CurrentValue; // 첫 번째 값, SecondValue, CurrentValue; // 첫 번째 값, 첫 번째 값, 두 번째 값 및 계산에 참여하는 (! postfixStack.isempty ()) {currentValue = postFixStack.pop (); if (! isoperator.car anits (0)). 연산자, Operand 스택 currentValue = currentValue.Replace ( "~", "-"); resultStack.push (currentValue);} else {// 연산자 인 경우 오페라 스택에서 두 값을 가져 와서 값 secondValue = resultStack.pop ()와 함께 작동에 참여합니다. FirstValue = firstValue.Replace ( "~", "-"); SecondValue = secondValue.Replace ( "~", "-"); String TemPresult = Calculation (FirstValue, SecondValue, currentValue.charat (0)); resultStack.push (tempresult);}} retud double.pop.pop.pop.pop.pop.pop.pop.pop. 준비 단계는 표현식을 접미사 스택으로 변환 * * @param expression */private void 준비 (문자열 표현) {opstack.push ( ','); // 연산자는 쉼표를 스택의 하단 요소에 넣고이 기호는 가장 낮은 우선 순위 char를 가지고 있습니다. 이 산술 연산자에 대한 연산자는 편리하거나 수치 적차 전류, Peekop; // 현재 연산자 및 상단 스택 연산자 (int i = 0; i <arr.length; i ++) {currentop = arr [i]; if (isoperator (currentop)) {// 현재 캐릭터가 (count> 0) {postfixStack. (new stack. count)); // 두 연산자 사이에서 숫자를 가져옵니다.} peekop = opstack.peek (); if (currentop == ')') {// 브랜치가 닿지 않으면 오프닝 괄호가 발생할 때까지 연산자 스택의 요소를 접미사 스택으로 제거합니다 (opstack.peek ()! = '('). {postfixstack.push (string.valueof (opstack.pop ()));} opstack.pop ();} else {while (currentop! = '('&& peekop! = ','&& compart (currentop, peekop)) {postfixstack.push (string.valueof ())). opstack.peek ();} opstack.push (currentop);} count = 0; currentIndex = i+1;} else {count ++;}} if (count> 1 || (count> 1 || (count == 1 &&! isoperator (arr [currentIndex]))) {// 마지막 캐릭터가 브라켓 또는 다른 운영자가 아닌 경우, STACK STACK에 추가하십시오. String (arr, currentIndex, count);} while (opstack.peek ()! = ',') {postfixstack.push (string.valueof (opstack.pop ())); // 연산자 스택에 남은 요소를 접미사 스택}}}}}}}}}}}/** * @param c * @param c * @Parporal isoperator (char c) {c == '-'|| c == '||. 엿보기 우선 순위는 CUR보다 높고, 반환, 기본 엿보기 우선 순위는 부울 결과 = false입니다. 문자열 계산 (문자열 firstValue, String secon string.valueof (arithhelper.mul (firstValue, secondValue)); break; case '/': result = string.valueof (arithHelper.div (firstValue, SecondValue)); break;} recult;}}Arithhelper 코드는 다음과 같습니다.
공개 클래스 ArithHelper {// 기본 부서 작업 정확도 개인 정적 최종 최종 최종 최종 DEF_DIV_SCALE = 16; //이 클래스는 개인 ArithHelper () {}/*** 인스턴스화 할 수 없습니다. 정확한 추가 작업을 제공합니다. * * * @param v1 addd * @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 java.math.bigdecimal (double.tostring (v2)); return b1.add (b2) .doublevalue ();} public static double add (문자열 v1, 문자열 v2) {java.math.bigdecimal b1 = new java.math.bigdecimal (v1); java.math.bigdecimal b2 = java.math.bigdecimal (v2); return b1.add (b2) .doublevalue ();}/***는 정확한 빼기 작업을 제공합니다. *** @param v1 suxtracted* @param v2 suptract* @ @@return의 차이 두 매개 변수*/public static double sub (double v1, double v2) {java.math.bigdecimal b1 = new java.math.bigdecimal (double.tostring (v1)); java.math.bigdeciment 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 곱 */public static double mul (double v1, double v2) {java.math.bigdecimal b1 = new java.math.bigdecimal (double.toString (v1)); java.math.bigdecimal b2 = 새로운 B2 = java.math.bigdecimal (double.tostring (v2)); b1.multiply (b2) .doublevalue ();} public static double mul (문자열 v1, 문자열 v2) {java.math.bigdecimal b1 = new Java.Math.bigdecimal (v1); java.math.bigdecimal (v2); return b1.multiply (b2) .doublevalue ();}/*** 정확한 분할 작업을 제공합니다. 분할이 없으면 소수점 이후 10 자리로 정확하며 후속 숫자가 반올림됩니다. * * * @param v1 * divider * @param v2 * divider * @ @return quartation */public static double div (double v1, double v2) {return div (v1, v2, def_div_scale);} public static doub (문자열 v1, 문자열 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_ublue (); 분리를 완료하기위한 끝이 없으면 정확도는 스케일 매개 변수로 지정되고 후속 숫자가 반올림됩니다. ** @param v1 divider* @param v2 divider* @param scale은 소수점 이후 몇 자리에 정확해야 함을 의미합니다. */public static double div (double v1, double v2, int scale) {if (scale <0) {throw new new ImperalArgumentException ( "스케일은 긍정적 인 정수 또는 0이어야한다")} 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.round_hound_hound_hound_hound_hound_up). 정확한 소수점 반올림. ** @param v round round in rounding* @param scale 소수점 이후 몇 자리 숫자가 몇 자리를 유지 한 후*/public static double round (double v, int scale) {if (scale <0) {throw new IllegalArgumentException ( "스케일은 양의 정수 또는 제로")} java.math.bigdecimal b = newdecimal b = newdecimal b = rounding*/public static double round (double v, int scale) {vask vere new IllegalArgumentException (}}) 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 ();}}}}}} 0) {새로운 불법 정수 또는 제로 여야합니다. 긍정적 인 정수 또는 0이어야합니다 ");} java.math.bigdecimal b = new java.math.bigdecimal (v); java.math.bigdecimal one = new Java.math.bigdecimal ("1 "); java.math.bigdecimal.round_half_up) .doublevalue ();}}그것을 사용할 때, 계산기 클래스의 converion () 메소드를 호출하고 산술 표현식 매개 변수를 전달하여 유형의 값을 반환하십시오.
사용의 예 :
공개 클래스 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 Computational Mathematical Expression Code에 대한 자세한 설명입니다. 모든 사람에게 도움이되기를 바랍니다. 관심있는 친구는이 사이트의 다른 관련 주제를 계속 참조 할 수 있습니다. 단점이 있으면 메시지를 남겨 두십시오. 이 사이트를 지원해 주신 친구들에게 감사드립니다!