思想
二分法,自最开始 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();
}
}
}
网友评论