Java BigDecimal Square Root sqrt(BigDecimal value, int decimalPlaces)

Here you can find the source of sqrt(BigDecimal value, int decimalPlaces)

Description

sqrt

License

Open Source License

Parameter

Parameter Description
value a parameter
decimalPlaces a parameter

Declaration

public static BigDecimal sqrt(BigDecimal value, int decimalPlaces) 

Method Source Code


//package com.java2s;
/*//w w w .j  ava 2s.c o  m
 * Utility class to simplify the use of BigDecimals
 * Copyright (C) 2012 Martin Absmeier, IT Consulting Services
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

import java.math.BigDecimal;

import java.math.MathContext;
import java.math.RoundingMode;

public class Main {
    /**
     * 
     * @param value
     * @param decimalPlaces
     * @return
     */
    public static BigDecimal sqrt(BigDecimal value, int decimalPlaces) {
        BigDecimal zero = BigDecimal.ZERO.setScale(decimalPlaces + 10);
        BigDecimal one = BigDecimal.ONE.setScale(decimalPlaces + 10);
        BigDecimal two = new BigDecimal("2").setScale(decimalPlaces + 10);
        BigDecimal maxerr = one.movePointLeft(decimalPlaces);
        BigDecimal lower = zero;
        BigDecimal upper = value.compareTo(one) <= 0 ? one : value;
        BigDecimal mid = BigDecimal.ZERO;

        while (true) {
            mid = lower.add(upper).divide(two);
            // mid = lower.add(upper).divide(two, RoundingMode.HALF_UP);
            BigDecimal sqr = mid.multiply(mid);
            BigDecimal error = value.subtract(sqr).abs();
            if (error.compareTo(maxerr) <= 0) {
                break;
            }
            if (sqr.compareTo(value) < 0) {
                lower = mid;
            } else {
                upper = mid;
            }
        }

        return mid.round(getMathContext(decimalPlaces));
    }

    private static MathContext getMathContext(int decimalPlaces) {
        return new MathContext(decimalPlaces, RoundingMode.HALF_UP);
    }
}

Related

  1. sqrt(BigDecimal number)
  2. sqrt(BigDecimal number, RoundingMode rounding)
  3. sqrt(BigDecimal original, int scale)
  4. sqrt(BigDecimal randicand)
  5. sqrt(BigDecimal value)
  6. sqrt(BigDecimal value, MathContext mc)
  7. sqrt(BigDecimal x)
  8. sqrt(final ArrayList data)
  9. sqrtNewtonRaphson(BigDecimal c, BigDecimal xn, BigDecimal precision)