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

    private static double sqrt(int n, int p) {
double lower = 0;
while (lower * lower < n) {
lower++;
}
--lower; int flag = 1;
int d = 10;
while (flag <= p + 1) {
d = 10;
for (int x = 1; x < flag; x++) {
d = d * 10;
}
double step = 1.d / d;
for (int i = 0; i < 10; i++) {
if (lower * lower > n) {
break;
}
lower = lower + step;
}
lower = lower - step; flag++;
} double v1 = lower * (d * 10);
int v = ((int) v1 % 100) / 10;
double res;
if (v < 5) {
res = (lower * d - v) / d;
} else {
res = (lower * d - v + 10) / d;
}
return res;
}

参数中n是整数,p是精度。这种程序一般不能支持特别高的精度(比如几十位),五六位就不错了。

代码原理简单,这里就不说了。先看一下输出:

    public static void main(String[] args) {
System.out.println("2 1 = " + sqrt(2, 1));
System.out.println("2 2 = " + sqrt(2, 2));
System.out.println("2 3 = " + sqrt(2, 3));
System.out.println("2 4 = " + sqrt(2, 4));
System.out.println("3 2 = " + sqrt(3, 2));
System.out.println("3 3 = " + sqrt(3, 3));
System.out.println("25 4 = " + sqrt(25, 4));
System.out.println("25 6 = " + sqrt(25, 6));
}

输出

2 1 = 1.4000000000000004

2 2 = 1.41

2 3 = 1.414

2 4 = 1.4142

3 2 = 1.7300000000000004

3 3 = 1.7320000000000004

25 4 = 5.0000099999999925

25 6 = 5.000000099999996

由于double精度的问题,输出并不完全满足要求,当需要几位精度的时候要截取前几位。

另外,当输入的整数比较大的时候,精度丢失也比较快:

2500 5 = 50.00000000000001

2500 6 = 49.999999500000015

25 6 = 5.000000099999996

25 7 = 4.999999949999996

可以看到给25开根号6位精度还行,给2500开的话,6位精度已经不能保证了。


上面的代码在while确定整数部分的时候可以优化,并不需要把所有小于平方根的数都过滤一遍。读者可以尝试一下。

最新文章

  1. ruby发送邮件方法
  2. Codeforces 741A:Arpa&#39;s loud Owf and Mehrdad&#39;s evil plan(LCM+思维)
  3. 编tuxedo遇到服务问题
  4. 大endian和little endian
  5. Future 和 ExecutorCompletionService 对比和使用
  6. 在Winfrom下实现类似百度、Google搜索自能提示功能
  7. Erlang edoc 多级目录出错
  8. mysql命令行的导入导出sql,txt,excel(都在linux或windows命令行操作)(转自筑梦悠然)
  9. 集腋成裘-09-ECharts -HelloECharts-02
  10. linux if -d -e -f表达的意思
  11. DDD实战进阶第一波(三):开发一般业务的大健康行业直销系统(搭建支持DDD的轻量级框架二)
  12. Spring MVC的路径匹配规则 Ant-style
  13. [整理]Git使用文章整理
  14. J-Link Version
  15. Mybatis源码分析之SqlSessionFactory(一)
  16. python多进程并发
  17. CURL的学习和应用
  18. transform动画效果
  19. 冲刺ing-7
  20. Ubuntu下配置安装telnet server

热门文章

  1. FHQ简要笔记
  2. 安全声明标记语言SAML2.0初探
  3. Spring自带的定时任务框架Schedule的优缺点及使用
  4. Java JVM——2.类加载器子系统
  5. 超详细分析Bootloader到内核的启动流程(万字长文)
  6. js上 五、运算符-1
  7. OS第六章
  8. python 画图二(三维图,多轴图)
  9. 最速下降法--MATLAB程序
  10. (二)、vim即gvim的炫酷搜索模式与技巧