java实现开根号的运算
面试的时候,偶然被问到,开根号的实现,虽然给面试官讲解了思路,但是没有实际实现过,今天闲来无事,就把自己的思路写一下,做个笔记。
如果某个数字正好可以开根号为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实现开根号的运算的更多相关文章
- Java实现开根号运算(不使用数组和String)
使用Java自己实现开根号运算,网上也有不少代码,多数都使用String或者数组.这里写一段只使用double基础数据类型实现的方法. private static double sqrt(int n ...
- java实现开根号算法
public static void main(String[] args) { long start = System.currentTimeMillis(); double target=9876 ...
- HDU 5828 Rikka with Sequence(线段树 开根号)
Rikka with Sequence Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Othe ...
- Java中的Bigdecimal类型运算
Java中的Bigdecimal类型运算 双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提 供的API类BigD ...
- java模拟开锁
java模拟开锁 service qq:928900200 Introduction to Computer Science II: CSCI142Fall 2014Lab #1Instructor: ...
- paper 76:膨胀、腐蚀、开、闭运算——数字图像处理中的形态学
膨胀.腐蚀.开.闭运算是数学形态学最基本的变换.本文主要针对二值图像的形态学膨胀:把二值图像各1像素连接成分的边界扩大一层(填充边缘或0像素内部的孔):腐蚀:把二值图像各1像素连接成分的边界点去掉从而 ...
- J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP
J2EE进阶(十四)超详细的Java后台开发面试题之Spring IOC与AOP 前言 搜狐畅游笔试题中有一道问答题涉及到回答谈谈对Spring IOC与AOP的理解.特将相关内容进行整理. ...
- 用C语言将一个数开根号后再取倒数的方法
在上学的时候,曾经看过有人写过这样的算法,就是将一个数开根号后再取倒数的算法,我本人也觉得十分巧妙,于是就将它积累了下来,让我们来看看是怎么回事: #include <stdio.h> # ...
- java中多个数字运算后值不对(失真)处理方法
最近遇到一个bug ,在java里面计算两个数字相减,633011.20-31296.30 得到的结果居然是601714.8999999999,丢失精度了,原来这是Java浮点运算的一个bug. 解决 ...
随机推荐
- [译] Ruby如何访问Excel文件
Parsing Excel Files with Ruby BY: MATT NEDRICH 翻译:佣工7001 本文中,我将会评判几种Ruby语言访问Excel文件的库.我将要讨论针对不同格式 ...
- Microsoft SQL Server数据库语法
目录 关于数据库的语法: 1.创建数据库 create database 数据库名on primary(主文件属性(name,filename,size等)) -用逗号隔开次要主要文件和次要文件( ...
- CSS揭秘-半透明边框与多重边框
场景一: 实现半透明边框: 由于CSS样式的默认行为,背景色的渲染范围是 content+padding+border. 半透明边框被主调色影响, 实现的效果为 解决方案: 使用backgroun ...
- java开发中,一些小的JS应用
js中打开一个新窗口的方法: 1.window.location.href=“url” 2.jbox.win(); 3.window.open(); js无任何提示的关闭弹出的页面: window.o ...
- jquery问题,如何调用带this的函数?
这样写: 1 2 3 4 5 6 7 8 9 10 11 12 $(".aa").on("mouseout",function(){ var obj = ...
- ES10(2019)有哪些更新和新特性?
ES10新特性(2019) 行分隔符(U + 2028)和段分隔符(U + 2029)符号现在允许在字符串文字中,与JSON匹配 更加友好的 JSON.stringify 新增了Array的flat( ...
- RabbitMQ基本概念(二)-RabbitMQ消息队列架构与基本概念
没错我还是没有讲怎么安装和写一个HelloWord,不过快了,这一章我们先了解下RabbitMQ的基本概念. RabbitMQ架构 说是架构其实更像是应用场景下的架构(自己画的有点丑,勿嫌弃) 从图中 ...
- springboot2.1.3 配置前后端跨域问题
很简单,创建一个配置类即可,如下: package com.app.gateway.common.config; import org.springframework.context.annotati ...
- Odoo中的Widget
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826144.html 一:Widget是什么 Odoo中定义了字段的显示形式,不同字段类型的字段都有其不同 ...
- 定时任务工具Linux crontab命令详解
crontab:定时任务的守护进程,精确到分,设计秒的我们一般写脚本 -->相当于闹钟 日志文件: ll /var/log/cron* 编辑文件: vim /et ...