【问题标题】:Java square root calculator?Java平方根计算器?
【发布时间】:2015-02-08 21:52:52
【问题描述】:

好的,我是java初学者,通过网站和书籍自学。我尝试了一个带有for 循环和while 循环的简单平方根计算器(我已经包含了我在下面尝试的内容)。可悲的是,当我输入一个数字时,我的所有代码都会终止。任何帮助将不胜感激!

import java.util.Scanner;

public class The2RootProdject {
    public static void main(String args[]) {

        Scanner input = new Scanner(System.in);
        double rootIt = input.nextDouble();
        double dummy = 0.0000000;

        while (dummy != dummy * dummy) {
            dummy += 0.0000001;
            if (rootIt == dummy * dummy) {
                System.out.println("the squar root of " + rootIt + " is "
                        + (dummy * dummy));
            }

        }

    }
}

【问题讨论】:

  • while (0 != 0*0) 不会被执行,对吧?
  • 一个数字几乎永远不会等于它自己乘以它自己,除非我遗漏了什么。这将导致循环立即退出。
  • 嗯,0 等于 0 * 0,所以永远不会进入 while 循环。
  • dummy != dummy * dummy“应该”是rootIt != dummy * dummy(整个算法不是一个好主意)。也许你应该学会使用调试器自己发现这样的问题。
  • 您的输入不太可能有有理平方根。考虑检查rootIt 是否接近dummy * dummy,而不是完全相等。

标签: java square-root


【解决方案1】:

这里有几个问题:

1) 逻辑错误:0 == 0 * 0

while (dummy != dummy * dummy) {..} 永远不会是不真实的,你甚至永远不会进入循环

2) 浮点数不精确,因此您的算法(依赖于“==”)可能无论如何都不起作用

在此处查看有关浮点不精度的更多详细信息:

http://www.lahey.com/float.htm

ANY 语言都是如此 - 您的平方根算法必须考虑到这一点。

【讨论】:

    【解决方案2】:

    尝试使用这个使用牛顿迭代的算法:

    import java.util.Scanner;
    
    public class Main
    {
        public static void main(String args[])
        {
            double number, t, squareRoot;
            Scanner input = new Scanner(System.in);
            number = input.nextDouble();
            squareRoot = number / 2;
            do
            {
                t = squareRoot;
                squareRoot = (t + (number / t)) / 2;
            }
            while ((t - squareRoot) != 0);
    
            System.out.println(squareRoot);
        }
    }
    

    牛顿迭代是一种通过递推方程计算数字平方根的算法: X(n+1) = (X(n) + 数字/X(n))/2

    【讨论】:

    • 感谢您的帮助!顺便说一句,我是 java 新手,那么“do”是做什么的?
    【解决方案3】:

    我认为while条件应该是=

    while(rootIt != dummy * dummy) {} 
    

    只有将dummy 初始化为 1,您的当前条件才会为真;但我不认为那会是你想要的。

    【讨论】:

      猜你喜欢
      • 2011-04-15
      • 2021-08-03
      • 1970-01-01
      • 2020-03-19
      • 2019-07-23
      • 2017-04-30
      • 1970-01-01
      • 2023-01-05
      • 1970-01-01
      相关资源
      最近更新 更多