Java,为什么Math.sqrt()返回0

时间:2017-12-18 15:32:46

标签: java math sqrt

我正在尝试检查数字是否为正方形,如果数字是三角形。 问题发生在 sqrt(num),对于我测试的所有数字,它返回0 我正在使用在线编译器,尝试了几个编译器,因此它不是编译问题。试图将num声明为double和int,结果相同 我是Java新手,但不是编程的新手,我在网上搜索,多次检查我的代码,一切看起来都很好,它甚至在添加变量以检查三角形数字之前按预期工作,但在声明变量checkTri和checkTriSqr之后,这开始发生了。我确定这与声明这些变量无关(几乎可以肯定),有人可以帮我理解这里发生了什么吗?

import static java.lang.Math.sqrt;
import static java.lang.Math.round;

public class Parent{

public static void main(String[] args){

    class Number
    {
        public int num ;
        double numSqr = sqrt(num );
        double roundNumSqr =  round(numSqr) ;
        double checkTri = 8 * num + 1 ;
        double checkTriSqr = sqrt(checkTri) ;

        public void prinTest()
        {
            System.out.println(num);
            System.out.println(numSqr);
            System.out.println(roundNumSqr);
            System.out.println(checkTri);
            System.out.println(checkTriSqr);
        }

        public boolean isSqr()
        {
            if (numSqr == roundNumSqr)
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public boolean isTriangular(){

            if (checkTriSqr * checkTriSqr == checkTri )
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

    Number number = new Number();

    number.num = 350;
    number.prinTest();
    System.out.println(number.isSqr());
    System.out.println(number.isTriangular());
 }
}

编辑:以下屏幕截图来自我正在关注的教程,涉及在方法中声明类!

enter image description here

6 个答案:

答案 0 :(得分:4)

此:

public int num ;
double numSqr = sqrt(num );

在实例构造时将num初始化为0(在没有赋值的情况下为整数的默认值),然后立即设置numSqr(为零)。

每次稍微设置sqrt()时,您需要重新计算num(可能通过提供方法setNum()并重新计算该方法中的所有内容)

我不打电话给你的班级Number,顺便说一句。标准Java类集中已经有Number类。

答案 1 :(得分:2)

numSqr在构造函数中创建,而number.num = 350;在构造对象后声明。

你可以使用这样的构造函数:

public Numer(int num){
    this.num=num;
    this.numSqr=sqrt(num)
    //.... ... ...
}

您还可以使用空构造函数和setter来设置数字属性:

public void setNumber(int num){
    this.num=num;
    this.numSqr=sqrt(num)
    //.... ... ...
}

答案 2 :(得分:2)

numSqrroundNumSqr等都是在对象创建时设置的,但是你不能将num设置为任何东西,直到创建对象后。结果是,例如,

创作时:

num = 0

因此

numSqr = 0
roundNumSqr = 0

然后,您设置num = 350 但是你没有重置numSqr等的值,所以情况仍然如此:

numSqr = 0
roundNumSqr = 0

您需要为此类创建一个构造函数,该构造函数接受num的值,然后设置所有相应的值,以便它们仅在设置num之后设置(或者,添加&#34 ;计算"更新所有值的函数。)

答案 3 :(得分:1)

您可以通过这种方式进行修改,并与您所使用的技术进行比较。

import static java.lang.Math.sqrt;
import static java.lang.Math.round;


public class Number {

    public int num = 0;

    public void prinTest() {

        System.out.println(this.num);
        System.out.println(this.getSqrt(this.num));
        System.out.println(this.getCheckTri());
    }

    private double getSqrt(double value) {
        return sqrt(value);
    }

    public boolean isSqr() {
        if (this.getSqrt(this.num) == round(this.getSqrt(this.num))) {
            return true;
        } else {
            return false;
        }
    }

    private double getCheckTri() {

        return 8 * this.num + 1;
    }

    public boolean isTriangular() {

        if (this.getSqrt(this.getCheckTri()) * this.getSqrt(this.getCheckTri()) == this.getCheckTri()) {
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {

        Number number = new Number();

        number.num = 49;
        number.prinTest();
        System.out.println(number.isSqr());
        System.out.println(number.isTriangular());

    }
}

您应该阅读一些基本教程,因为您在main方法中添加了类,这意味着您需要更多时间来检查语法。

答案 4 :(得分:0)

另一个答案alreade说,字段num没有设置为输入数字,其他字段实际上是在对象创建时评估的,因此也是零。

然而,目的是通过简单的功能来实现:

   public static boolean isSquare(int num) {
       int root = (int) Math.round(Math.sqrt(num));
       return root*root == num;
   }

   public static boolean isCubic(int num) {
       int root = (int) Math.round(Math.cbrt(num));
       return root*root*root == num;
   }

这会利用立方根

作为双打的比较,sqrt结果及其舍入的长值仍然不精确,我更喜欢重新计算原始参数。

答案 5 :(得分:0)

public int num ;
double numSqr = sqrt(num);

默认情况下,声明的实例整数变量(在类体内声明的变量)初始化为0(零)。因此,您的代码只会采用零的平方根,即零