import java.math.BigDecimal;
public class SquareRoot {
//精确小数位数,越精确,效率越低
public static int SCALE = 5;
/**精确格式 如:String.format("0.%05d",1) = 0.00001*/
private static Double SCALE_DOUBLE = Double.valueOf(String.format("0.%0"+SCALE+"d",1));
public static BigDecimal sqrt(int num){
if(num < 1){
return BigDecimal.valueOf(-1);
} else if(num == 1){
return BigDecimal.ONE;
}
//首先定位到两个连续的整数范围内
int max = num;
int min = 0;
//当两个整数相减=1时,说明已经定位到了整数范围如5-6之间
while( (max - min) != 1){
//使用二分查找法
int mid = (max+min)/2;
//计算中间数的乘积
int j = mid*mid;
if(j>num){
max = mid;
} else if(j < num){
min = mid;
} else {
//直接相等,如3*3=9
return BigDecimal.valueOf(mid);
}
}
//System.out.println(String.format("整数区间(%d,%d)",min,max));
//继续精确到指定的小数位
return sqrt(num,BigDecimal.valueOf(min),BigDecimal.valueOf(max));
}
private static BigDecimal sqrt(int num,BigDecimal min,BigDecimal max){
BigDecimal numb = BigDecimal.valueOf(num);
BigDecimal mid = null;
BigDecimal j = null;
while(true){
mid = min.add(max).divide(BigDecimal.valueOf(2));
j = mid.multiply(mid);
if(j.compareTo(numb) > 0){
max = mid;
} else {
min = mid;
}
// 当差值在0.00001时说明精确到了小数点后5位
if(numb.compareTo(j)>0 &&
numb.subtract(j).doubleValue() < SCALE_DOUBLE){
break;
}
}
return mid.setScale(SCALE,BigDecimal.ROUND_FLOOR);
}
public static void main(String []args) {
System.out.println(sqrt(100));
System.out.println(sqrt(99));
System.out.println(sqrt(8));
}
}
JAVA实现平方根公式算法,超简单看不懂算我输
猜你喜欢
转载自blog.csdn.net/weixin_48470176/article/details/107940310
今日推荐
周排行