สตริง Java จะถูกแปลงเป็นการแสดงออกทางคณิตศาสตร์เพื่อคำนวณและส่งออกผลลัพธ์ เครื่องมือนี้สามารถคำนวณการแสดงออกทางคณิตศาสตร์โดยตรงในรูปแบบของสตริงและใช้งานง่ายมาก
เครื่องมือนี้มีสองคลาสเครื่องคิดเลขและ arithhelper
รหัสเครื่องคิดเลขมีดังนี้:
นำเข้า java.util.collections; นำเข้า Java.util.stack;/*** การประเมินการแสดงออกทางคณิตศาสตร์* การเรียกใช้วิธีการแปลงคลาสของเครื่องคิดเลขโดยตรง ()* การผ่านการแสดงออกทางคณิตศาสตร์จะส่งคืนค่าจุดลอยตัว* สแต็ค <caricy> opstack = ใหม่สแต็ก <caricy> (); // ตัวดำเนินการสแต็กส่วนตัว int [] ผู้ดำเนินการ = new int [] {0, 3, 2, 1, -1, 1, 0, 2}; // ลำดับความสำคัญของตัวดำเนินการโดยใช้ตัวดำเนินการ ASCII Code -40) cal.Calculate (นิพจน์);} catch (ข้อยกเว้น e) {// e.printstacktrace (); // ข้อผิดพลาดการดำเนินการส่งคืน nanreturn 0.0/ 0.0;} // ส่งคืนสตริงใหม่ (). ค่า (ผลลัพธ์); return ผลลัพธ์;}/ *** เปลี่ยนสัญลักษณ์ของตัวเลขลบ ~ 2+~ 1 *(~ 3e ~ 2)-(~ 1) *@return */การแปลงสตริงแบบคงที่ส่วนตัว (นิพจน์สตริง) {char [] arr = expression.toChararray (); สำหรับ (int i = 0; i <arr.length; i ++) {ถ้า (arr [i] == '-') (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == 'e' || c == 'e') {arr [i] = '~';}}}} ถ้า (arr [0] == ' String (arr);} else {ส่งคืนสตริงใหม่ (arr);}}/** * คำนวณตามนิพจน์ที่กำหนด * * @param นิพจน์ * นิพจน์ที่จะคำนวณตัวอย่างเช่น: 5+12 * (3+5)/7 * @return */การคำนวณสองครั้ง) สตริงสแต็คคำต่อท้ายที่สอง, secondValue, currentValue; // ค่าแรก, ค่าที่สอง, currentValue; // ค่าแรก, ค่าที่สองและตัวดำเนินการเลขคณิตที่เข้าร่วมในการคำนวณในขณะที่ (! postfixstack.isempty ()) {currentValue = postfixstack.pop () ตัวดำเนินการเก็บไว้ในสแต็ก currentValue = currentValue.replace ("~", "-"); resultStack.push (currentValue);} else {// ถ้าเป็นตัวดำเนินการให้ใช้ค่าสองค่าจาก notedValive; Sign FirstValue = firstValue.replace ("~", "-"); secondValue = secondValue.replace ("~", "-"); String tempresult = คำนวณ (FirstValue, SecondValue, CurrentValue.charat (0)); resultStack.push (tempresult); ขั้นตอนการเตรียมข้อมูลแปลงนิพจน์เป็นสแต็กคำต่อท้าย * * @param นิพจน์ */โมฆะส่วนตัวเตรียม (การแสดงออกของสตริง) {opstack.push (','); // ผู้ปฏิบัติงานวางเครื่องหมายจุลภาคไว้ในองค์ประกอบด้านล่างของสแต็ก ตัวดำเนินการทางคณิตศาสตร์ไปยังตัวดำเนินการทางคณิตศาสตร์นี้มีความสะดวกหรือเป็นตัวเลขถ่าน currentop, peekop; // ตัวดำเนินการปัจจุบันและตัวดำเนินการด้านบนสแต็กสำหรับ (int i = 0; i <arr.length; i ++) {currentOp = arr [i]; ถ้า (isoperator (currentOp) {// CurrentIndex, count)); // ใช้หมายเลขระหว่างตัวดำเนินการสองตัว} peekop = opstack.peek (); ถ้า (currentOp == ')') {// เมื่อเผชิญหน้ากับ Unbranch ให้ลบองค์ประกอบในสแต็กของผู้ปฏิบัติงาน {postfixstack.push (string.valueof (opstack.pop ()));} opstack.pop ();} else {ในขณะที่ (currentop! = '(' && peekop! = ',' && compare opstack.peek ();} opstack.push (currentop);} count = 0; currentIndex = i+1;} else {count ++;}} ถ้า (นับ> 1 || (count == 1 &&! isoperator (arr [currentindex]))) String (arr, currentindex, count));} ในขณะที่ (opstack.peek ()! = ',') {postfixstack.push (string.valueof (opstack.pop ())); // เพิ่มองค์ประกอบที่เหลือในสแต็คของผู้ประกอบการ isoperator (char c) {return c == '+' || c == '-' || c == ' *' || {// หากลำดับความสำคัญของ PEEK สูงกว่า CUR, RETURN TRUE, PEEK PORTIONITY เริ่มต้นคือผลการบูลีนที่ต่ำกว่า = false; @return */สตริงส่วนตัวคำนวณ (สตริง FirstValue, String SecondValue, Char CurrentOp) {String result = ""; switch (currentOp) {case '+': result = string.valueof (arithhelper.add (firstValue, secondValue); break; '*': result = string.valueof (arithhelper.mul (FirstValue, SecondValue)); break; case '/': result = string.valueof (arithhelper.div (FirstValue, SecondValue)); break;รหัส arithhelper มีดังนี้:
คลาสสาธารณะ ARITHHELPER {// การดำเนินการส่วนเริ่มต้นความแม่นยำส่วนตัวคงที่ int final int def_div_scale = 16; // คลาสนี้ไม่สามารถสร้างอินสแตนซ์ส่วนตัว arithhelper () {}/*** ให้การดำเนินการเพิ่มเติมที่ถูกต้อง * * @param v1 เพิ่ม * @param v2 เพิ่ม * @return ผลรวมของพารามิเตอร์สองพารามิเตอร์ */public Static double add (double v1, double v2) {java.math.bigdecimal b1 = Java.math.bigdecimal (double.tostring (v1)) 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 java.math.bigdecimal (v2); return b1.add (b2) .doublevalue ();}/*** ให้การดำเนินการลบที่แม่นยำ ** @param v1 ลบออก* @param v2 ลบ* @return ความแตกต่างระหว่างสองพารามิเตอร์*/สาธารณะคงที่สองส่วนย่อย (คู่ v1, คู่ v2) {java.math.bigdecimal b1 = ใหม่ java.math.bigdecimal (double.tostring (v1)) 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 (bigdecimal.bigdecimal.bigdecimal b1 java.math.bigdecimal (v2); return b1.subtract (b2) .doublevalue ();}/*** ให้การคูณการคูณที่แม่นยำ * * @param v1 * ตัวทวีคูณ * @param v2 * ตัวทวีคูณ * @return ผลิตภัณฑ์ของสองพารามิเตอร์ */public double mul (คู่ v1, double v2) {java.math.bigdecimal b1 = 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.Math.Bigdecimal B1 ใหม่ java.math.bigdecimal (v2); return b1.multiply (b2) .doublevalue ();}/*** ให้ (ค่อนข้าง) การดำเนินการหารที่แม่นยำ เมื่อไม่มีการแบ่งแยกจะมีความแม่นยำถึง 10 หลักหลังจากจุดทศนิยมและตัวเลขที่ตามมาจะถูกปัดเศษ * * @param v1 * Divider * @param v2 * Divider * @return ใบเสนอราคาของสองพารามิเตอร์ */สาธารณะคงที่ double div (คู่ v1, double v2) {return div (v1, v2, def_div_scale); java.math.bigdecimal (v1); java.math.bigdecimal b2 = ใหม่ java.math.bigdecimal (v2); return b1.divide (b2, def_div_scale, java.math.bigdecimal.round_half_up) การดำเนินการแผนก เมื่อไม่มีการสิ้นสุดในการแยกความถูกต้องจะถูกระบุโดยพารามิเตอร์สเกลและตัวเลขที่ตามมาจะถูกปัดเศษ ** @param v1 Divider* @param v2 Divider* @param scale หมายความว่ามันจะต้องแม่นยำสำหรับตัวเลขหลายหลักหลังจากจุดทศนิยม * @return Quotient ของพารามิเตอร์สองตัว*/สาธารณะคงที่ double div (คู่ v1, double v2, scale int) {ถ้า (ขนาด <0) {โยน unlegalargumentexception ใหม่ ("สเกลจะต้องเป็นจำนวนเต็มบวกหรือศูนย์");} java.math.bigdecimal b1 = ใหม่ java.math.bigdecimal (double.tostring (v1)); java.math.bigdecimal b2 = ใหม่ java.math.bigdecimal (double.tostring (v2)); return b1.divide (b2, scale java.math.bigdecimal.round_half_up) .doublevalue ();}/*** ให้การปัดเศษทศนิยมที่แม่นยำ ** @param v นับว่าต้องโค้งมน* @param ขนาดเท่าใดจะถูกเก็บไว้หลังจากจุดทศนิยม* @ @@Return ผลลัพธ์หลังจากการปัดเศษ*/รอบสองรอบสาธารณะ (คู่ v, สเกล int) {ถ้า (สเกล <0) java.math.bigdecimal (double.toString (v)); java.math.bigdecimal one = ใหม่ java.math.bigdecimal ("1"); กลับ b.divide (หนึ่งขนาด, java.math.bigdecimal.round_half_upt) {ถ้า (มาตราส่วน <0) {โยน unleglArgumentException ใหม่ ("มาตราส่วนจะต้องเป็นจำนวนเต็มบวกหรือศูนย์");} java.math.bigdecimal b = ใหม่ java.math.bigdecimal (v); java.math.bigdecimal one = new Java.math.bigd.bigd.math java.math.bigdecimal.round_half_up) .doublevalue ();}}เมื่อใช้งานให้เรียกใช้วิธีการแปลง () ของคลาสเครื่องคิดเลขและส่งผ่านในพารามิเตอร์การแสดงออกทางคณิตศาสตร์เพื่อส่งคืนค่าประเภทสองเท่า
ตัวอย่างการใช้งาน:
คลาสสาธารณะ MathTest {โมฆะคงที่สาธารณะหลัก (String [] args) {string expression = "(0*1--3) -5/-4- (3*(-2.13))"; double result = calculator.conversion (นิพจน์); system.out.println (นิพจน์ + "=" + ผลลัพธ์);เอาต์พุตคอนโซล:
(0*1--3) -5/-4- (3*(-2.13)) = 10.64
ทดสอบภาพหน้าจอ:
สรุป
ข้างต้นเป็นคำอธิบายโดยละเอียดทั้งหมดของรหัสนิพจน์ทางคณิตศาสตร์การคำนวณ Java ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงหัวข้ออื่น ๆ ที่เกี่ยวข้องในเว็บไซต์นี้ต่อไป หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!