public double evaluate() {
		double current;
		DIGIT digit = DIGIT.START;
		greaterThanHundredsValues = new LinkedList<Double>(); 
		/* Used to store temporary values such as five million one hundred thousand
			can be evaluated as (five million) + (one hundred thousand) */


		int length = values.size();
		int i;

		// Handle tokens up to a decimal point
		for (i = 0; i < length && (current = values.get(i)) >= 0; i++) {	// Decimal points are represented as -1
			switch (digit) {
				case START: digit = handleSTART(current);
						    break;
				case START_ZERO: digit = handleSTARTZERO(current);
								 break;
				case ZERO: digit = handleZERO(current); 
							 break;
				case UNITS: digit = handleUNITS(current);
							  break;
				case TEENS: digit = handleTEENS(current);
							  break;
				case TENS: digit = handleTENS(current);
							 break;
				case HUNDRED: digit = handleHUNDRED(current);
							  break;
				case GREATER_THAN_HUNDREDS: digit = handleGREATER(current);
							 break;
			}
		}

		for (double d : greaterThanHundredsValues) {
			operandValue += d;
		}

		// Handle tokens after a decimal point
		String decimals = ".";
		for (i++; i < length; i++) {
			decimals += (int)((double)values.get(i)); // Unbox to double and then cast to int so 
													  // that no extra decimal points are added to the string
		}

		if (decimals.length() > 1) {
			try {
				operandValue += Double.parseDouble(decimals);
			} catch (Exception e) {
				System.out.println("NLCalc cannot understand the input: Error 1");
				System.out.println("Please try again.");
				System.exit(1);
			}
		}

		return operandValue;
	}