JAVA实现平方根公式算法,超简单看不懂算我输

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));


    }
}

猜你喜欢

转载自blog.csdn.net/weixin_48470176/article/details/107940310