`
hb_keepmoving
  • 浏览: 230550 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

BigDecimal 运算

 
阅读更多
package com.fbj.expression;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import com.fbj.expression.parse.Parse;
import com.fbj.expression.token.NumToken;
import com.fbj.expression.token.OprToken;
import com.fbj.expression.token.Token;
import com.fbj.expression.util.Util;

public class Expression {
	
	public static List<Token> parse(String src){
		
		if(src != null && !src.isEmpty()){
			src = src.replaceAll(" +", "").replaceAll("÷", "/").replaceAll("×", "/");
			int mark = 0;
			Token token = null;
			List<Token> tokens = new ArrayList<Token>();
			while (mark < src.length()) {
				Parse parse = Util.getParse(String.valueOf(src.charAt(mark)));
				token = parse.parse(src, mark);
				if(token != null){
					tokens.add(token);	
					mark = token.getEnd();
				}else {
					mark++;
				}
				
				
			}
			return tokens;
			
		}
		return null;
	}
	
	public static Token run(List<Token> tokens){
		
		
		if(tokens != null){
			//checkMinus(tokens);
			int mark = 0;
			int weight = 0;
			int weightOffset = 0;
			run : while (tokens.size() >= 2) {
				weightOffset = 0;
				weight = 0;
//				if(tokens.size() == 5){
//					System.out.println();
//				}
				System.out.print("要处理的表达式exp=");
				for(Token token2 : tokens){
					System.out.print("[" +token2.getValue() + "]");
				}
				System.out.println();
//				System.out.println("还剩:" + tokens.size());
				//int i = 0;
				//按优先级查找
				Token token =null;
				for(int i =0 ; i <tokens.size() ; i++){
					token = tokens.get(i);
					if(token.getWeight() > weight){
						weight = token.getWeight();
						weightOffset = i;
					}
					if(weight == Util.weights.length -1){
						
						
					}
				}
				//System.out.println("最优先:" + tokens.get(weightOffset).getValue());
				if(weight > 2){
				//不是基础运算,继续化简
				//首先找到他的配对标记
				int flag = 0;
				int end = 0;
				Token subToken = null;
				token = tokens.get(weightOffset);
				for(int j = weightOffset+1 ; j < tokens.size(); j++){
					subToken = tokens.get(j);
					//System.out.println(subToken.getValue());
					if(subToken.getWeight() == weight){
						//找到同优先级的,判断是否是一对
						if(subToken.getValue().equals(token.getValue())){
							flag++;
						}else if(subToken.getValue().equals(Util.getEnd(token.getValue()))){
							
							flag--;
							
						}
						if(flag == -1){
							//找到了
							end = j;
							break;
						}
					}
				}
				if(end > 0){
					//先算出结果
					List<Token> subRTokens = tokens.subList(weightOffset + 1, end);
					
					
					
					Token subResultToken = run(subRTokens);
					//tokens.removeAll(subRTokens);
//					System.out.print("\n旧reg=");
//					for(Token token2 : tokens){
//						System.out.print(token2.getValue());
//					}
					tokens.remove(weightOffset +2);
					tokens.remove(weightOffset);
					
					
					weight = 0;
				}
				
				continue run;
				}
//				System.out.print("\nexp=");
//				for(Token token2 : tokens){
//					System.out.print( token2.getValue());
//				}
//				System.out.println();
				//找完优先级开始运算
				Token result = null;
				if(tokens.size() >=3 && weightOffset != 0){
					result = calculation(tokens.get(weightOffset - 1), tokens.get(weightOffset + 1), tokens.get(weightOffset));
					tokens.remove(weightOffset -1);
					tokens.remove(weightOffset -1);
					tokens.remove(weightOffset -1);
					tokens.add(weightOffset -1, result);
				}else {
					result = calculation(null, tokens.get(weightOffset + 1), tokens.get(weightOffset));
					tokens.remove(0);
					tokens.remove(0);
					tokens.add(0 , result);
				}
				
				
			}
			
			return tokens.get(0);
		}
		return null;
	}
	
	public static Token calculation(Token pre , Token next , Token opr){
		
		if(next instanceof NumToken && opr instanceof OprToken){
			
			if(pre == null){
				
				if ("-".equals(opr.getValue())) {
					next.setValue("-" +next.getValue());
				}
				return next;
				
			}else if (next instanceof NumToken ){
				String op = opr.getValue();
				if(pre.getC().equals(Double.class) || next.getC().equals(Double.class) || "/".equals(opr.getValue())){
					BigDecimal bigDecimal = new BigDecimal(pre.getValue());
					BigDecimal bigDecimal2 = new BigDecimal(next.getValue());
					BigDecimal result = null;
					if("+".equals(op)){
						result = bigDecimal.add(bigDecimal2);
					}else if ("-".equals(op)) {
						result = bigDecimal.subtract(bigDecimal2);
					}else if ("*".equals(op)) {
						result = bigDecimal.multiply(bigDecimal2);
					}else if ("/".equals(op)) {
						result = bigDecimal.divide(bigDecimal2 , 9 , BigDecimal.ROUND_CEILING);
					}
					Token token = new NumToken();
					token.setC(Double.class);
					token.setValue(result.toString().replaceAll("0+$", ""));
					return token;
				}else {
					Integer integer1 = new Integer(pre.getValue());
					Integer integer2 = new Integer(next.getValue());
					
					Integer result = null;
					if("+".equals(op)){
						result = integer1 + integer2;
					}else if ("-".equals(op)) {
						result = integer1 - integer2;
					}else if ("*".equals(op)) {
						result = integer1 * integer2;
					}else if ("/".equals(op)) {
						result = integer1 / integer2;
					}
					Token token = new NumToken();
					token.setC(Integer.class);
					token.setValue(result.toString());
					return token;
					
				}
			}
			
			
		}
		return null;
	}
	
	public static Token start(String exp){
		
		List<Token> tokens = Expression.parse(exp);

		return run(tokens); 
	}
	public static void main(String[] args) {
		String exp = "-(10 * 2) +(-9*45.8)/4*3-2";
		//List<Token> tokens = Expression.parse(exp);
//		for(Token token : tokens)
//			System.out.println(token.getValue() + "," + token.getWeight());
		Token token = start(exp);
		System.out.println("\n" +exp + "="+token.getValue());
		
		
	}
	public static void checkMinus(List<Token> tokens){
		Token pre = null;
		Token c = null;
		for(int i = 0 ; i < tokens.size() ; i++){
			c = tokens.get(i);
			if("-".equals(c.getValue())){
				if(pre == null || pre instanceof OprToken){
					
					if((i+1 < tokens.size())){
						Token next = tokens.get(i+1);
						if(next instanceof NumToken){
							next.setValue("-" + next.getValue());
							tokens.remove(i);
						}
					}
				}
			}	
			pre = c;
		}
	}
	
	public static void print(String title , List<Token> tokens){
		System.out.print("\n"+title+"表达式");
		for(Token token : tokens){
			System.out.print(token.getValue());
		}
		System.out.println();
	}

}

 

分享到:
评论

相关推荐

    BigDecimal运算封装.txt

    BigDecimal运算封装,里面封装了Integer和BigDecimal的"加减乘除法运算封装

    BigDecimal运算

    BigDecimal运算Jar包。支持sin、cos、tan、asin、acos、atan、pow、sqrt、cbrt、root、log10、log、ln、exp、sinh、cosh、tanh、asinh、acosh、atanh、deg、rad

    高精度JSBigDecimal运算

    `bigdecimal3.js`可能是一个实现了BigDecimal运算的JavaScript库,它可以提供比原生JavaScript更精确的十进制数运算。这个库可能包括了加法、减法、乘法、除法以及比较、取模等多种操作,确保在执行这些操作时不会...

    java BigDecimal操作

    `MathExtend.java`这个文件可能是包含了一些扩展的数学操作,比如自定义的舍入方法或者更复杂的BigDecimal运算。在实际开发中,我们可能需要编写这样的辅助类来实现特定的业务需求。 总的来说,理解和熟练运用...

    MyEditTextApplication输入框BigDecimal计算价格

    6. **性能优化**:由于BigDecimal运算相对于基本类型来说较慢,因此在处理大量数据或者频繁计算时,要注意优化代码,避免不必要的计算和内存开销。 7. **UI更新**:在更新EditText中的显示时,应该在UI线程进行,...

    BigDecimal 加减乘除运算

    Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...

    BigDecimal基本运算介绍

    `BigDecimal` 的运算方式与基本数据类型有所不同,因为它涉及到的对象操作而非简单的数值计算。 ### 1. 创建 `BigDecimal` 对象 `BigDecimal` 构造器通常接收一个字符串参数,该字符串表示要转换为 `BigDecimal` ...

    javascrpt BigDecimal 大数运算类 完整版(包括例子)

    其中BigDecimal-all-last.min.js大小为:26KB GZIP压缩后7K,完全可以用于实际生产过程中。 简单例子: var a = new BigDecimal("1500"); var b = new BigDecimal("33"); alert&#40;a.multiply(b&#41;); alert&#...

    Java中BigDecimal的基本运算(详解)

    Java中BigDecimal的基本运算详解 Java中的BigDecimal是一种高精度的数据类型,它可以用来表示非常大的整数和小数,提供了丰富的数学运算功能。下面我们将对Java中BigDecimal的基本运算进行详细的介绍。 构造方法 ...

    javascript BigDecimal 大数运算类 单文件浓缩版

    本版中只有一个用于生产环境的文件:BigDecimal-all-last.min.js,大小为26K,如果WEB服务器打开GZIP压缩,可以减小至7K,如需完整版本请移步至:http://download.csdn.net/detail/aquaqu2009/4575230 简单用法: ...

    BigDecimal工具类.docx

    BigDecimal工具类是Java中用于高精确处理常用数学运算的工具类。该工具类提供了多种精确的数学运算方法,包括加法、减法、乘法和除法等。 在BigDecimal工具类中,我们可以看到多个重载的方法,例如add方法和sub方法...

    BigDecimal类

    BigDecimal 类是 Java 中的一种数值类型,主要用于处理超过 16 位有效数字的数值运算。该类提供了多种构造器和方法,用于创建和操作 BigDecimal 对象。 构造器 BigDecimal 类提供了四种构造器,用于创建不同的 ...

    Java使用BigDecimal进行运算封装的实际案例

    "Java使用BigDecimal进行运算封装的实际案例" 今天,我们将讨论Java中使用BigDecimal进行运算封装的实际案例。BigDecimal是Java中一个用于处理精确数字计算的类,它提供了多种数学运算方法,如加法、减法、乘法、除...

    BigDecimal.js.zip

    这个库提供了一个名为`BigDecimal`的数据类型,用于实现大数运算,确保结果的精度不受损失。 "BigDecimal.js.zip"是一个压缩包,其中包含了"BigDecimal-all-last.min.js"文件。这个文件是BigDecimal.js库的最小化...

    javascript版BigDecimal类库

    为了解决这个问题,开发者们引入了`BigDecimal`类库的概念,它在Java中被广泛使用,用于进行高精度的算术运算。本文将详细介绍JavaScript版的`BigDecimal`类库,以及如何在JavaScript环境中实现精确计算。 ...

    bigdecimal转integer.docx

    `BigDecimal` 用于处理精确的浮点数运算,适合财务或金融计算,因为它可以避免浮点数计算中的精度问题。而 `Integer` 是 Java 中的整数类型,它只能存储整数值。在某些情况下,我们可能需要将 `BigDecimal` 对象转换...

    BigDecimal使用

    3. 精确的加法运算:使用 BigDecimal 的 add 方法可以进行精确的加法运算,例如将两个 BigDecimal 对象相加并返回结果。 4. 精确的减法运算:使用 BigDecimal 的 subtract 方法可以进行精确的减法运算,例如将两个 ...

    BigDecimal加减乘除计算

    BigDecimal 类在 Java 中被设计用来处理高精度的浮点数运算,主要应用于财务、金融等领域,因为这些场景中对精度要求非常高。BigDecimal 提供了加法(add())、减法(subtract())、乘法(multiply())和除法...

    javascrpt BigDecimal MathContext 大数运算类 完整版

    build/BigDecimal-all-last.js build/BigDecimal-all-last.min.js build/preserved_multiline_comment_begin.closure.js build/preserved_multiline_comment_begin.yui.js build/preserved_mult

    BigDecimal向Double转换

    在Java编程语言中,BigDecimal是一种用于处理高精度数值的数据类型,尤其适用于金融计算等领域,因为它可以提供不受限的小数位数精度以及精确的数学运算能力。然而,在某些情况下,我们可能需要将BigDecimal类型的值...

Global site tag (gtag.js) - Google Analytics