String型计算公式,给结果



/**
* 定义运算符
*/
public static List<String> lc = new ArrayList<String>();
static {
lc.add("+");
lc.add("-");
lc.add("*");
lc.add("/");
}

/**
* 四则运算表达式处理.
* @param str
* @return String
*/
public Double szys(String gs) {
gs = gs + "+0"; // 因为下面的计算是遇到符号才进行,所以多加入一个计算符号,不影响值.
String c1 = "";// 第一个运算符号
String c2 = "";// 第二个运算符号
String s1 = "";// 第一个运算数
String s2 = "";// 第二个运算数
String s3 = "";// 第三个运算数

int len = gs.length();
for (int i = 0; i < len; i++) {
String s = String.valueOf(gs.charAt(i));// 获得该位置字符并转换成字符串做比较

if (lc.contains(s)) { // 如果是运算符号
if (c1.length() == 0)// 如果第一个运算符号为空,加入
c1 = s;
else if (c2.length() == 0) {// 否则,如果第二个运算符号为空,加入
c2 = s;// 第二个运算符号
if ("+".equals(c2) || "-".equals(c2)) {// 如果第二个运算符号级别低,那么进行计算
s1 = _4zys(s1, c1, s2);// 第一个和第二个数计算
c1 = c2;// 保存第二个运算符,其他为空
c2 = "";
s2 = "";
}
} else {// 上述都保存过
if ("+".equals(s) || "-".equals(s)) {// 如果第三个运算符级别低,进行运算
s2 = _4zys(s2, c2, s3);// 先算第二三个数,保存至第二个
s1 = _4zys(s1, c1, s2);// 再算第一二个,保存至第一个
c1 = s;// 保存当前运算符,其他为空
s2 = "";
c2 = "";
s3 = "";
} else {// 如果第三个运算符级别高
s2 = _4zys(s2, c2, s3);// 先算第二三个数,保存至第二个
c2 = s;// 前面不动,保存运算符
s3 = "";
}
}
} else if (s1.length() > 0 && c1.length() > 0 && c2.length() == 0) {// 如果第一个数,第一个运算符已保存,第二个运算符未保存,保存第二个数
s2 += s;
} else if (c1.length() == 0) {// 如果没有运算符,保存第一个数
s1 += s;
} else if (s1.length() > 0 && s2.length() > 0 && c1.length() > 0
&& c2.length() > 0) {// 如果第一二个数和运算符都有,保存第三个数
s3 += s;
}
}
return Double.valueOf(s1);
}

/**
* 基本四则运算.
* @param c1
* 运算数1.
* @param s1
* 运算符(加减乘除).
* @param c2
* 运算数2.
* @return String
*/
public String _4zys(String c1, String s1, String c2) {
String reval = "0";
try {
double ln = Double.valueOf(c1).doubleValue();
double rn = Double.valueOf(c2).doubleValue();
if ("+".equals(s1)) {
return (ln + rn) + "";
} else if ("-".equals(s1)) {
return (ln - rn) + "";
} else if ("*".equals(s1)) {
return (ln * rn) + "";
} else if ("/".equals(s1)) {
if (rn == 0)
return reval;
else
return (ln / rn) + "";
}
} catch (Exception e) {
} finally {
}

return reval;
}

/**
* 公式计算.
* @param price
* @param expressions
* 传入参数票价以及计算公式.
* @return
* 返回票价.
*/
public Integer count(String price, String expressions) {
// 验证表达式是否符合规范.
String temp = "";
// 获取票价后面字符.
if (expressions.length() != (expressions.indexOf("X") + 1)) {
temp = String.valueOf(expressions
.charAt(expressions.indexOf("X") + 1));
}
if (expressions.length() == (expressions.indexOf("X") + 1)
|| "+".equals(temp) || "-".equals(temp) || "*".equals(temp)
|| "/".equals(temp)) {
// 将票价丢到表达式中去.
expressions = expressions.replace("X", price);
// 调用计算方法.
Double b = szys(expressions);
// 进行四舍五入.
int c = Integer.parseInt(b.toString().substring(0,
b.toString().indexOf(".")));
int e = (Integer.parseInt(b.toString().substring(
b.toString().indexOf(".") + 1,
b.toString().indexOf(".") + 2)) > 4) ? 1 : 0;
return c + e;
} else {
System.out.println("不规范.");
}
return 0;
}


调用测试:

String a = "X*0.97+10";
System.out.println(szys("450", a));


打印结果为:447
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,计算π的方法主要有两种:蒙特卡罗方法和数学公式法。这里以数学公式法为例,介绍Java的串行、并行、并发计算π的实现方法。 1. 串行计算π 首先,我们可以使用莱布尼茨级数公式来计算π。该公式的计算公式为:π/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + ... + (-1)^(n+1)/(2n-1)。我们可以通过循环来计算这个公式,直到达到预设的精度。下面是一个Java串行计算π的示例代码: ``` public class SerialPi { public static void main(String[] args) { long start = System.currentTimeMillis(); int n = 100000000; // 循环次数 double sum = 0.0; for (int i = 1; i <= n; i++) { double item = (i % 2 == 1 ? 1 : -1) * 1.0 / (2 * i - 1); sum += item; } double pi = 4 * sum; long end = System.currentTimeMillis(); System.out.println("Pi: " + pi); System.out.println("Time: " + (end - start) + "ms"); } } ``` 2. 并行计算π 对于计算π这种密集计算任务,我们可以使用并行计算来提高计算效率。Java提供了多线程的机制来实现并行计算。我们可以将计算任务分配给多个线程来同时进行计算,最后将结果进行合并。下面是一个Java并行计算π的示例代码: ``` public class ParallelPi { private static final int NTHREADS = 4; // 线程数量 private static final int N = 100000000; // 循环次数 private static double[] sumArray = new double[NTHREADS]; public static void main(String[] args) throws InterruptedException { long start = System.currentTimeMillis(); Thread[] threads = new Thread[NTHREADS]; for (int i = 0; i < NTHREADS; i++) { int id = i; threads[i] = new Thread(() -> { double sum = 0.0; for (int j = id; j < N; j += NTHREADS) { double item = (j % 2 == 1 ? 1 : -1) * 1.0 / (2 * j - 1); sum += item; } sumArray[id] = sum; }); threads[i].start(); } for (Thread thread : threads) { thread.join(); } double sum = 0.0; for (double item : sumArray) { sum += item; } double pi = 4 * sum; long end = System.currentTimeMillis(); System.out.println("Pi: " + pi); System.out.println("Time: " + (end - start) + "ms"); } } ``` 3. 并发计算π Java的并发计算可以通过线程池来实现。线程池可以有效地管理线程的数量,避免线程创建和销毁的开销。下面是一个Java并发计算π的示例代码: ``` public class ConcurrentPi { private static final int NTHREADS = 4; // 线程数量 private static final int N = 100000000; // 循环次数 private static double[] sumArray = new double[NTHREADS]; public static void main(String[] args) throws InterruptedException, ExecutionException { long start = System.currentTimeMillis(); ExecutorService executor = Executors.newFixedThreadPool(NTHREADS); List<Future<Double>> futures = new ArrayList<>(); for (int i = 0; i < NTHREADS; i++) { int id = i; futures.add(executor.submit(() -> { double sum = 0.0; for (int j = id; j < N; j += NTHREADS) { double item = (j % 2 == 1 ? 1 : -1) * 1.0 / (2 * j - 1); sum += item; } return sum; })); } double sum = 0.0; for (Future<Double> future : futures) { sum += future.get(); } double pi = 4 * sum; long end = System.currentTimeMillis(); System.out.println("Pi: " + pi); System.out.println("Time: " + (end - start) + "ms"); executor.shutdown(); } } ``` 以上就是Java串行、并行、并发计算π的示例代码,希望能对您有所帮助。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值