Java高精度四则运算(无括号限制)
package cn.skyatom.common;
?
import java.math.BigDecimal;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
?
/**
?* 基础四则运算
?*
?* @author ZWK
?*/
public class Arithmetic {
?
? ? private static String getUUID() {
? ? ? ? return java.util.UUID.randomUUID().toString().replaceAll("-", "");
? ? }
?
? ? public static void main(String[] args) throws Exception {
? ? ? ? java.util.Map values = new java.util.HashMap();
? ? ? ? BigDecimal AAF = new BigDecimal(5.5);
? ? ? ? BigDecimal BCCC = new BigDecimal(8);
? ? ? ? BigDecimal QQC = new BigDecimal(-8.33);
? ? ? ? BigDecimal DCC = new BigDecimal(2);
? ? ? ? BigDecimal EE = new BigDecimal(23);
? ? ? ? BigDecimal BF = new BigDecimal(2.5);
? ? ? ? BigDecimal A1 = new BigDecimal(12);
? ? ? ? BigDecimal A2 = new BigDecimal(4);
? ? ? ? BigDecimal A3 = new BigDecimal(5);
? ? ? ? BigDecimal A4 = new BigDecimal(15);
?
? ? ? ? values.put("AAF", AAF);
? ? ? ? values.put("BCCC", BCCC);
? ? ? ? values.put("QQC", QQC);
? ? ? ? values.put("DCC", DCC);
? ? ? ? values.put("EE", EE);
? ? ? ? values.put("BF", BF);
? ? ? ? values.put("A1", A1);
? ? ? ? values.put("A2", A2);
? ? ? ? values.put("A3", A3);
? ? ? ? values.put("A4", A4);
?
//? ? ? ?
//? ? ? ? values.put("B1", 4F);
//? ? ? ? values.put("B2", 15f);
//? ? ? ? values.put("B3", 55f);
//? ? ? ? values.put("B4", 2f);
//? ? ? ? values.put("B5", 5f);
? ? ? ? String str = "AAF? * BCCC + QQC? /DCC-EE*BF+( A1*(A2/(A3+A4))? ) ";//5.5*8 + (-8.33)/2 - 23*2.5 + (12*(4/(5+15)) )
? ? ? ? //String str = "B1? * B2 + B3 -B4/? B5 ";//去空白
? ? ? ? //BigDecimal v = getArithmeticValue(str, values);
? ? ? ? System.out.println("结果为:" + getArithmeticFloatValue(str, values));
? ? }
?
? ? /**
? ? * 执行运算,获取表达式的结果。float值
? ? *
? ? * @param str
? ? * @param values
? ? * @return
? ? * @throws Exception
? ? */
? ? public static float getArithmeticFloatValue(String str, java.util.Map values) throws Exception {
? ? ? ? return getArithmeticValue(str, values).floatValue();
? ? }
?
? ? public static int getArithmeticIntValue(String str, java.util.Map values) throws Exception {
? ? ? ? return getArithmeticValue(str, values).intValue();
? ? }
?
? ? public static long getArithmeticLongValue(String str, java.util.Map values) throws Exception {
? ? ? ? return getArithmeticValue(str, values).longValue();
? ? }
?
? ? /**
? ? * 替换括号
? ? *
? ? * @param str
? ? * @param values
? ? * @return 当所有替换完成,null,反之返回替换的字符串
? ? */
? ? private static String replaceBrackets(String str, java.util.Map values) {
? ? ? ? String v = "";
? ? ? ? String tmp = null;//临时字符串值
? ? ? ? Pattern patt = Pattern.compile("\\(([A-Za-z0-9\\.\\*\\+\\-/]*?)\\)", Pattern.DOTALL);
? ? ? ? Matcher mat = patt.matcher(str);
? ? ? ? if (mat.find()) {
? ? ? ? ? ? tmp = mat.group(1);
? ? ? ? }
? ? ? ? if (tmp != null) {
? ? ? ? ? ? String uuid = getUUID();
? ? ? ? ? ? BigDecimal value = getBasicArithmeticValue(tmp, values);
? ? ? ? ? ? str = str.replace("(" + tmp + ")", uuid);
? ? ? ? ? ? values.put(uuid, value);
? ? ? ? ? ? v = str;
? ? ? ? ? ? v = replaceBrackets(v, values);
? ? ? ? } else {
? ? ? ? ? ? v = str;
? ? ? ? }
? ? ? ? return v;
? ? }
?
? ? /**
? ? * 执行运算,获取表达式的结果
? ? *
? ? * @param str 表达式字符串
? ? * @param values 值存储表
? ? * @return 返回运算值
? ? * @throws java.lang.Exception 运算格式错误时,抛出异常
? ? */
? ? public static BigDecimal getArithmeticValue(String str, java.util.Map values) throws Exception {
? ? ? ? str = str.replaceAll("\\s*", "");//去空白
? ? ? ? String s = replaceBrackets(str, values);
? ? ? ? if (s != null || !s.trim().equals("")) {
? ? ? ? ? ? str = s;
? ? ? ? }
? ? ? ? return getBasicArithmeticValue(str, values);
? ? }
?
? ? /**
? ? * 基本四则运算
? ? *
? ? * @param str 基础四则运算
? ? * @param values 值存储表
? ? * @return
? ? */
? ? private