【问题标题】:Basic Square root program基本平方根程序
【发布时间】:2016-02-16 02:56:45
【问题描述】:

我正在尝试编写一个程序,该程序使用古代巴比伦平均方法计算数字的平方根。该程序的目标是显示用户输入的数字、平均方法的值、使用数学包的值,以及平均方法和数学包之间的差异。我遇到的唯一问题是差异的输出为 0.000。有人可以帮我了解这两种方法之间的实际区别。这是我的程序代码:

import java.util.*;
public class SquareRoot
{
    static Scanner console = new Scanner(System.in);
    public static void main(String[] args)
    {
        int k;  
        double number;
        double number2; 
        double generator ;
        double Difference; 

        generator = (int)(Math.random() * 20 + 1); // generates a random number between '1' and '20' 

////////////////////////Take input from the user/////////////////////////////////////////////////////        
        System.out.print("Please enter the number that you want to take the square root of: ");
        number = console.nextDouble();


 //////////////////////////generate the square root using the averaging method///////////////////////       
        for( k = 1; k <= 10; k++ )
        {
            generator = ( generator + (number/generator)) / 2;
        }    

////////////////////////Place the math package value in 'number2' and take the difference of the////// 
/////////////////////// averaged value and the true math package value//////////////////////////////// 
        number2 = Math.sqrt(number);

        Difference = (number2 - generator);

///////////////////////////////Display the results to the user////////////////////////////////////////       
        System.out.println("\nNumber    SquareRoot  MathPackage Difference");
        System.out.printf("%-6.3f    %-10.3f  ", number, generator);
        System.out.printf("%-11.3f %-10.3f%n" , number2 , Difference);




    }
}

【问题讨论】:

    标签: java


    【解决方案1】:

    您的随机数生成器有点关闭。你想要类似的东西

    double generator = 1 + (Math.random() * 20);
    

    当我进行更正时,您现有的代码可以正常工作。但是,我建议您在准备好初始化变量之前不要声明变量。另外,我建议您遵循小写 camelCase 变量名称的 Java 命名约定 (difference)。最后,在static 字段中围绕System.in 放置Scanner 似乎不必要地复杂。把它们放在一起,你的代码可能看起来像

    public static void main(String[] args) {
        Scanner console = new Scanner(System.in);
        System.out.print("Please enter the number that you want to take "
                + "the square root of: ");
        double number = console.nextDouble();
        double generator = 1 + (Math.random() * 20);
        for (int k = 0; k < 10; k++) {
            generator = (generator + (number / generator)) / 2;
        }
        double number2 = Math.sqrt(number);
        double difference = (number2 - generator);
        System.out.println("\nNumber    SquareRoot  MathPackage Difference");
        System.out.printf("%-6.3f    %-10.3f  ", number, generator);
        System.out.printf("%-11.3f %-10.3f%n", number2, difference);
    }
    

    更新

    在 10 次迭代之后,巴比伦方法将产生一个非常准确的答案(在double 的范围内)。尝试循环打印。类似的,

    double number = console.nextDouble();
    double number2 = Math.sqrt(number);
    double generator = 1 + (Math.random() * 20);
    System.out.println("Iteration    SquareRoot     Difference");
    for (int k = 0; k < 10; k++) {
        generator = (generator + (number / generator)) / 2;
        double difference = (number2 - generator);
        System.out.printf("%10d %-11.3f %-10.10f%n", k + 1, number2, difference);
    }
    

    然后你会看到近似的difference接近0

    【讨论】:

    • 您的代码不会改变小数位数,这正是他要找的。我运行了您的代码,但差异仍然是 0.000
    • 试试109300。巴比伦的方法很慢,但并不准确。
    • 就巴比伦的准确性而言,您是对的;我只是用 50 位小数运行程序,没有区别。但是,我仍然觉得你只是修复了他的代码,并没有真正回答他的问题。
    • @BenjaminLowry 已更新。经过反思,我相信 OP 对 difference 最感兴趣,因为计算了近似值。
    • 是的,这可能是真的,他可能应该在这一点上澄清一下。我继续将我的 DV 更改为 UV。
    【解决方案2】:

    要更改显示的小数位数,您需要将呼叫更改为printf

    在下面的代码中,小数点后的位数(在本例中为 3)指定显示小数点后的位数。

    System.out.printf("%-6.3f    %-10.3f  ", number, generator);
    System.out.printf("%-11.3f %-10.3f%n", number2, difference);
    

    为了显示更多数字(例如 10),将该数字增加到更高的数字。像这样:

    System.out.printf("%-6.10f    %-10.10f  ", number, generator);
    System.out.printf("%-11.10f %-10.10f%n" , number2 , Difference);
    

    如果您通过简单的更改运行相同的代码,您的输出将更改为:

    Number    SquareRoot  MathPackage Difference
    109300.0000000000    330.6055107088  330.6055050963 -0.0000056125
    

    您可能需要稍微处理一下格式,但除此之外它还可以。

    有关这种字符串替换工作的更多信息,请参阅Formatter 类的文档。

    【讨论】:

    • 不完全确定这是否是您所要求的,但 Benjamin 听起来是这样的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 2019-03-05
    • 1970-01-01
    • 2010-10-10
    相关资源
    最近更新 更多