* @param a_RoundingMode
     * @return
     */
    public BigDecimal getEulerConstantToAFixedDecimalPlacePrecision(
            int decimalPlaces,
            RoundingMode a_RoundingMode) {
        if (_E != null) {
            if (_E.scale() > decimalPlaces) {
                return roundIfNecessary(
                        new BigDecimal(_E.toString()),
                        decimalPlaces,
                        a_RoundingMode);
            }
        }
        _E = new BigDecimal("2");
        int safeDecimalPlaces = decimalPlaces + 3;
        //int maxite = 10000;
        //int maxite = decimalPlaces * 2;
        int maxite = safeDecimalPlaces;
        if (_Generic_BigInteger == null) {
            init_Factorial_Generic_BigInteger(maxite);
        } else {
            _Generic_BigInteger.factorial(maxite);
        }
        BigDecimal factorial;
        BigDecimal oneOverFactorial;
        BigDecimal tollerance = new BigDecimal(
                BigInteger.ONE, safeDecimalPlaces);
        // Use Taylor Series
        Integer factorialKey;
        for (int i = 2; i
                < maxite; i++) {
            factorialKey = new Integer(i);
            factorial = new BigDecimal(
                    _Generic_BigInteger._Factorial_TreeMap.get(factorialKey));
            oneOverFactorial = BigDecimal.ONE.divide(
                    factorial, safeDecimalPlaces, get_RoundingMode());
            _E = _E.add(oneOverFactorial);
            if (oneOverFactorial.compareTo(tollerance) == -1) {
                break;
            }
        }
        _E = roundIfNecessary(_E, decimalPlaces, a_RoundingMode);
        return new BigDecimal(_E.toString());
    }