求一个数的平方根

思想

二分法,自最开始 0 至该数的中点,比较中点乘积与该数的差值,直至差值小于指定精度。

示例

/**
 * 递归法
 *
 * @param n       数值
 * @param i       左边界
 * @param j       右边界
 * @param decimal 保留小数位
 * @return 指定精度平方根
 */
public double sqrt(int n, double i, double j, int decimal) {
    double m = (j - i) / 2 + i, threshold = Math.pow(0.1, decimal), tmp = m * m;
    if (Math.abs(tmp - n) > threshold) {
        return tmp > n ? sqrt(n, i, m, decimal) : sqrt(n, m, j, decimal);
    } else {
        return new BigDecimal(m).setScale(decimal, BigDecimal.ROUND_HALF_UP).doubleValue();
    }
}

/**
 * 循环法
 *
 * @param n       数值
 * @param decimal 保留小数位
 * @return 指定精度平方根
 */
public double sqrt(int n, int decimal) {
    double i = 0, j = n, m, threshold = Math.pow(0.1, decimal);
    while (true) {
        m = (j - i) / 2 + i;
        double tmp = m * m;
        if (Math.abs(tmp - n) > threshold) {
            if (tmp > n) {
                j = m;
            } else {
                i = m;
            }
        } else {
            return new BigDecimal(m).setScale(decimal, BigDecimal.ROUND_HALF_UP).doubleValue();
        }
    }
}

你可能感兴趣的:(求一个数的平方根)