java四则运算
来源:互联网 发布:rbac java 开源 编辑:程序博客网 时间:2024/06/11 02:52
public class Arithmetic implements Serializable {
/** 描述 */
private static final long serialVersionUID = 3661149212694931772L;
protected static Logger LOG = Logger.getLogger(Arithmetic.class);
public static double arithmetic(String exp) {
String result = parseExp(exp).replaceAll("[\\[\\]]", "");
return Double.parseDouble(result);
}
/**
* 除法
* @param number1 除数
* @param number2 被除数
* @param decimal 保留几位小数点
* @return
*/
public static double divide(String number1, String number2,
Integer decimal) {
double result = 0;
try {
if (null != number1 && !number1.equals("") || null != number2
&& !number2.equals("")) {
Double num1 = Double.valueOf(number1);
Double num2 = Double.valueOf(number2);
double res = num1 / num2;
if(decimal > 0) {
result = decimalFormat(res, decimal);
} else {
result = res;
}
}
} catch (ArithmeticException ae) {
LOG.error("对不起,除数为0!");
result = 0;
} catch (Exception e) {
LOG.error("divide error");
result = 0;
}
return result;
}
/**
* 保留小数点几位
* @param result
* @param decimal
* @return
*/
public static double decimalFormat(double result, Integer decimal) {
BigDecimal bg = new BigDecimal(result);
return bg.setScale(decimal, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 解析计算四则运算表达式,例:2+((3+4)*2-22)/2*3 描述
* @param expression
* @return
*/
public static String parseExp(String expression) {
// String numberReg="^((?!0)\\d+(\\.\\d+(?<!0))?)|(0\\.\\d+(?<!0))$";
expression = expression.replaceAll("\\s+", "").replaceAll("^\\((.+)\\)$", "$1");
// String checkExp = "\\d";
String minExp = "^((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))$";
// 最小表达式计算
if (expression.matches(minExp)) {
String result = calculate(expression);
return Double.parseDouble(result) >= 0 ? result : "[" + result + "]";
}
// 计算不带括号的四则运算
String noParentheses = "^[^\\(\\)]+$";
String priorOperatorExp = "(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";
String operatorExp = "(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";
if (expression.matches(noParentheses)) {
Pattern patt = Pattern.compile(priorOperatorExp);
Matcher mat = patt.matcher(expression);
if (mat.find()) {
String tempMinExp = mat.group();
expression = expression.replaceFirst(priorOperatorExp, parseExp(tempMinExp));
} else {
patt = Pattern.compile(operatorExp);
mat = patt.matcher(expression);
if (mat.find()) {
String tempMinExp = mat.group();
expression = expression.replaceFirst(operatorExp, parseExp(tempMinExp));
}
}
return parseExp(expression);
}
// 计算带括号的四则运算
String minParentheses = "\\([^\\(\\)]+\\)";
Pattern patt = Pattern.compile(minParentheses);
Matcher mat = patt.matcher(expression);
if (mat.find()) {
String tempMinExp = mat.group();
expression = expression.replaceFirst(minParentheses, parseExp(tempMinExp));
}
return parseExp(expression);
}
/**
* 计算最小单位四则运算表达式(两个数字) 描述
* @param exp
* @return
*/
public static String calculate(String exp) {
exp = exp.replaceAll("[\\[\\]]", "");
String number[] = exp.replaceFirst("(\\d)[\\+\\-\\*\\/]", "$1,").split(",");
BigDecimal number1 = new BigDecimal(number[0]);
BigDecimal number2 = new BigDecimal(number[1]);
BigDecimal result = null;
String operator = exp.replaceFirst("^.*\\d([\\+\\-\\*\\/]).+$", "$1");
if ("+".equals(operator)) {
result = number1.add(number2);
} else if ("-".equals(operator)) {
result = number1.subtract(number2);
} else if ("*".equals(operator)) {
result = number1.multiply(number2);
} else if ("/".equals(operator)) {
result = number1.divide(number2);
}
return result != null ? result.toString() : null;
}
public static void main(String[] args) {
// System.out.println(Arithmetic.divide("0", "30", 0));
System.out.println(arithmetic("2.2+((3+14)*2-22)/2*3.2"));
}
}
/** 描述 */
private static final long serialVersionUID = 3661149212694931772L;
protected static Logger LOG = Logger.getLogger(Arithmetic.class);
public static double arithmetic(String exp) {
String result = parseExp(exp).replaceAll("[\\[\\]]", "");
return Double.parseDouble(result);
}
/**
* 除法
* @param number1 除数
* @param number2 被除数
* @param decimal 保留几位小数点
* @return
*/
public static double divide(String number1, String number2,
Integer decimal) {
double result = 0;
try {
if (null != number1 && !number1.equals("") || null != number2
&& !number2.equals("")) {
Double num1 = Double.valueOf(number1);
Double num2 = Double.valueOf(number2);
double res = num1 / num2;
if(decimal > 0) {
result = decimalFormat(res, decimal);
} else {
result = res;
}
}
} catch (ArithmeticException ae) {
LOG.error("对不起,除数为0!");
result = 0;
} catch (Exception e) {
LOG.error("divide error");
result = 0;
}
return result;
}
/**
* 保留小数点几位
* @param result
* @param decimal
* @return
*/
public static double decimalFormat(double result, Integer decimal) {
BigDecimal bg = new BigDecimal(result);
return bg.setScale(decimal, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 解析计算四则运算表达式,例:2+((3+4)*2-22)/2*3 描述
* @param expression
* @return
*/
public static String parseExp(String expression) {
// String numberReg="^((?!0)\\d+(\\.\\d+(?<!0))?)|(0\\.\\d+(?<!0))$";
expression = expression.replaceAll("\\s+", "").replaceAll("^\\((.+)\\)$", "$1");
// String checkExp = "\\d";
String minExp = "^((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))$";
// 最小表达式计算
if (expression.matches(minExp)) {
String result = calculate(expression);
return Double.parseDouble(result) >= 0 ? result : "[" + result + "]";
}
// 计算不带括号的四则运算
String noParentheses = "^[^\\(\\)]+$";
String priorOperatorExp = "(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\*\\/]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";
String operatorExp = "(((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\]))[\\+\\-]((\\d+(\\.\\d+)?)|(\\[\\-\\d+(\\.\\d+)?\\])))";
if (expression.matches(noParentheses)) {
Pattern patt = Pattern.compile(priorOperatorExp);
Matcher mat = patt.matcher(expression);
if (mat.find()) {
String tempMinExp = mat.group();
expression = expression.replaceFirst(priorOperatorExp, parseExp(tempMinExp));
} else {
patt = Pattern.compile(operatorExp);
mat = patt.matcher(expression);
if (mat.find()) {
String tempMinExp = mat.group();
expression = expression.replaceFirst(operatorExp, parseExp(tempMinExp));
}
}
return parseExp(expression);
}
// 计算带括号的四则运算
String minParentheses = "\\([^\\(\\)]+\\)";
Pattern patt = Pattern.compile(minParentheses);
Matcher mat = patt.matcher(expression);
if (mat.find()) {
String tempMinExp = mat.group();
expression = expression.replaceFirst(minParentheses, parseExp(tempMinExp));
}
return parseExp(expression);
}
/**
* 计算最小单位四则运算表达式(两个数字) 描述
* @param exp
* @return
*/
public static String calculate(String exp) {
exp = exp.replaceAll("[\\[\\]]", "");
String number[] = exp.replaceFirst("(\\d)[\\+\\-\\*\\/]", "$1,").split(",");
BigDecimal number1 = new BigDecimal(number[0]);
BigDecimal number2 = new BigDecimal(number[1]);
BigDecimal result = null;
String operator = exp.replaceFirst("^.*\\d([\\+\\-\\*\\/]).+$", "$1");
if ("+".equals(operator)) {
result = number1.add(number2);
} else if ("-".equals(operator)) {
result = number1.subtract(number2);
} else if ("*".equals(operator)) {
result = number1.multiply(number2);
} else if ("/".equals(operator)) {
result = number1.divide(number2);
}
return result != null ? result.toString() : null;
}
public static void main(String[] args) {
// System.out.println(Arithmetic.divide("0", "30", 0));
System.out.println(arithmetic("2.2+((3+14)*2-22)/2*3.2"));
}
}
0 0
- java 四则运算
- 四则运算(Java)
- java 四则运算
- java四则运算
- java--四则运算
- java-- 四则运算
- JAVA四则运算
- 四则运算 java
- java求复数四则运算
- JAVA实现四则运算
- 四则运算JAVA实现
- java写的四则运算
- Java 四则运算表达式求解
- JAVA大数四则运算
- Java有理数的四则运算
- Java 四则运算表达式求解
- Java四则运算表达式求解
- Java 进行四则运算
- NS2的UDP模拟
- 符号对象(Symbolic Object)的使用
- 划分问题(dp)
- ADO初始化接口时出现“不支持此接口”错误
- javascript对象
- java四则运算
- This project is incompatible with the current version of Visual Studio
- android中init.rc文件的解析问题
- LINUX DNS 配置
- 关于shop++物流查询功能分享
- Loner_li 机试题 将数字 例如"12345.7895”,用程序实现显示"壹万贰仟叁佰肆拾伍圆柒角玖分"的方式
- C#正则表达式语法规则详解
- nodejs
- Easy的题