面试的时候,偶然被问到,开根号的实现,虽然给面试官讲解了思路,但是没有实际实现过,今天闲来无事,就把自己的思路写一下,做个笔记。

如果某个数字正好可以开根号为2个整数,例如1,4,9等,那就很简单了。

如果某个数字不可以正好开根号为2个整数,而且要保留几位精度,例如:2,3,5等,我们该怎么办呢?????

首先我们可以把这个数字分成整数部分和小数部分,分别计算。

例如√5≈2.236  我们可以先算出整数部分为2,然后在根据保留几位精度,去计算小数部分。依次计算十分位、百分位和千分位等,然后把整数位+十分位+百分位+千分位+。。。,结果就是我们想要的结果了。

下面我写了一个通用的方法,可以根据传的参数来保留精度。

package comc.n;

import java.math.BigDecimal;

public class Square {

	public static void main(String[] args) {
System.out.println(Math.sqrt(5));
System.out.println(MathSqure(5, 6));
}
/**
*
* @param n 需要开根号的数据
* @param m 需要保留的精度,即几位小数
* @return
*/
public static double MathSqure(int n, int m){
double[] arr = new double[m];
if(m >0){
arr = sc(m);
}
int s = sq(n); return sb(n, s, arr);
} /**
* 计算整数位
* @param n
* @return
*/
public static int sq(int n){
if( n == 1){
return 1;
}
int tmp = 0;
for(int i=1;i<=n/2+1;i++){
if(i*i == n){
tmp = i;
break;
}
if(i*i > n){
tmp = i-1;
break;
}
}
return tmp;
} /**
* 计算要保留几位小数
* @param m
* @return
*/
public static double[] sc(int m){
double[] arr = new double[m];
int num = 0;
while(num != m){
double f = 1;
for(int i=0;i<=num;i++){
f = f*10;
}
arr[num] = 1/f;
num++;
}
return arr;
} /**
* 开根号
* @param n
* @param j
* @param arr
* @return
*/
public static double sb(int n, double j, double[] arr){
double tmp = j;
for(int p=0;p<arr.length;p++){
if(p>0){
j = tmp;//计算过后的值(整数位+小数位的和,赋值给j,下面继续运算)
}
for(int i=1;i<=9;i++){//小数位只有九位{0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9}
tmp = i*arr[p]+j;//i*arr[p],相当于每次加0.1,0.2 ...
if(tmp*tmp == n){
return tmp;
}
if(tmp*tmp >n){
//避免丢失精度
BigDecimal c1 = new BigDecimal(Double.toString(tmp));
BigDecimal c2 = new BigDecimal(Double.toString(arr[p]));
tmp = c1.subtract(c2).doubleValue();
break;
}
}
}
return tmp;
}
}

输出结果:

原文出处:

慕安凉,java实现开根号的运算, https://blog.csdn.net/lsq_401/article/details/79678187

java实现开根号的运算的更多相关文章

  1. Java实现开根号运算(不使用数组和String)

    使用Java自己实现开根号运算,网上也有不少代码,多数都使用String或者数组.这里写一段只使用double基础数据类型实现的方法. private static double sqrt(int n ...

  2. java实现开根号算法

    public static void main(String[] args) { long start = System.currentTimeMillis(); double target=9876 ...

  3. HDU 5828 Rikka with Sequence(线段树 开根号)

    Rikka with Sequence Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

  4. Java中的Bigdecimal类型运算

    Java中的Bigdecimal类型运算 双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提 供的API类BigD ...

  5. java模拟开锁

    java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...

  6. paper 76:膨胀、腐蚀、开、闭运算——数字图像处理中的形态学

    膨胀.腐蚀.开.闭运算是数学形态学最基本的变换.本文主要针对二值图像的形态学膨胀:把二值图像各1像素连接成分的边界扩大一层(填充边缘或0像素内部的孔):腐蚀:把二值图像各1像素连接成分的边界点去掉从而 ...

  7. J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP

    J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言   搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理.    ...

  8. 用C语言将一个数开根号后再取倒数的方法

    在上学的时候,曾经看过有人写过这样的算法,就是将一个数开根号后再取倒数的算法,我本人也觉得十分巧妙,于是就将它积累了下来,让我们来看看是怎么回事: #include <stdio.h> # ...

  9. java中多个数字运算后值不对(失真)处理方法

    最近遇到一个bug ,在java里面计算两个数字相减,633011.20-31296.30 得到的结果居然是601714.8999999999,丢失精度了,原来这是Java浮点运算的一个bug. 解决 ...

随机推荐

  1. 【转载】 Windows系统电脑通过设备管理器查看电脑配置信息

    在采购电脑或者使用电脑的过程中,有时候我们需要查看到电脑的所有设备硬件信息,此时就可以通过Windows系统自带的设备管理器界面来查看该电脑所有的设备配置信息,包括CPU型号频率.内存.硬盘型号以及容 ...

  2. webpack 入门和常用插件的使用

    常用配置参数 module.exports = { context: path.resolve(__dirname, '../'), entry: { app: './src/main.js' }, ...

  3. ES6 之 Symbol

    1. 基本用法 Symbol 是ES6引入的一种新的原始数据类型,表示独一无二的值. 前六种基础数据类型是 undefined null Boolean String Number Object Sy ...

  4. SpringBoot,SSM和SSH

    Springboot的概念: 是提供的全新框架,使用来简化Spring的初始搭建和开发过程,使用了特定的方式来进行配置,让开发人员不在需要定义样板化的配置.此框架不需要配置xml,依赖于想MAVEN这 ...

  5. Java语言的介绍

    1. 计算机语言 语言:沟通交流的方式 计算机语言:人与计算机之间的交流方式 java是一门计算机编程语言,也是意大利自行车品牌 软件工程师,java开发工程师 <--------------- ...

  6. android黑白屏的问题

    你会很奇怪,为什么有些app启动时,会出现一会儿的黑屏或者白屏才进入Activity的界面显示,但是有些app却不会如QQ手机端,的确这里要做处理一下.这里先了解一下为什么会出现这样的现象,其实很简单 ...

  7. SSM相关知识梳理面试

  8. NumPy 之 面向数组编程

    import numpy as np Using NumPy arrays enables you to express many kinds of data processing tasks as ...

  9. Junit测试入门

    junit测试的6大注解 @BeforeClass    最先执行,在整个测试类中只会执行一次,所以它只能声明一次,并且被它标注的方法必须声明为static @Before       可以声明多个方 ...

  10. Spring Boot 2实现分布式锁——这才是实现分布式锁的正确姿势!

    参考资料 网址 Spring Boot 2实现分布式锁--这才是实现分布式锁的正确姿势! http://www.spring4all.com/article/6892