Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java中三角形总是表示为等边_Java_If Statement_Boolean_Geometry - Fatal编程技术网

在java中三角形总是表示为等边

在java中三角形总是表示为等边,java,if-statement,boolean,geometry,Java,If Statement,Boolean,Geometry,我不知道出了什么问题,但我的输出确定三角形有边1.0、1.0、1.0,并且总是等边的 public class Triangle { // fields private double side1; private double side2; private double side3; // constructor public Triangle (double sideA, double sideB, double sideC) {

我不知道出了什么问题,但我的输出确定三角形有边1.0、1.0、1.0,并且总是等边的

public class Triangle
{
    // fields
    private double side1;

    private double side2;

    private double side3;

    // constructor
    public Triangle (double sideA, double sideB, double sideC)
    {
        sideA = side1;
            sideB = side2;
            sideC = side3;

            if(isTriangle(sideA, sideB, sideC) == false)
            {
                side1 = 1;
                side2 = 1;
                side3 = 1;
            }
    }

    // methods
    public double getSide1()
    {
        return side1;
    }

    public double getSide2()
    {
        return side2;
    }

    public double getSide3()
    {
        return side3;
    }

    public boolean isTriangle(double sideA, double sideB, double sideC)
    {
        if (side1 + side2 > side3 || side2 + side3 > side1 || side3 + side1 > side2)
        {
                return true;
        }

        else
        {
                return false;
        }
    }
    public boolean isEquilateral()
    {
        if(side1 == side2 && side2 == side3)
        {
                return true;
        }

        else
        {
                return false;
        }
    }

    public boolean isRight()
    {
        if (Math.pow (side1, 2) +  Math.pow (side2, 2) == Math.pow (side3, 2) ||
            Math.pow (side2, 2) +  Math.pow (side3, 2) == Math.pow (side1, 2) ||
            Math.pow (side3, 2) +  Math.pow (side1, 2) == Math.pow (side2, 2))
        {
            return true;
        }

        else
        {
            return false;
        }
    }
}

// A06 Triangle
import java.util.Scanner;

public class triangleTest
{
    public static void main(String[] args)
    {
            Scanner input = new Scanner(System.in);

            double side1 = 0;
            double side2 = 0;
            double side3 = 0;

            System.out.print("Side1: ");
            side1 = input.nextDouble();
            System.out.print("Side2: ");
            side2 = input.nextDouble();
            System.out.print("Side3: ");
            side3 = input.nextDouble();
            System.out.println();

            Triangle myTriangle = new Triangle(side1, side2, side3);

            System.out.printf("Triangle( %.1f %.1f %.1f) %s\n", myTriangle.getSide1(),
            myTriangle.getSide2(), myTriangle.getSide3(), 
            myTriangle.isEquilateral() == true ? "is equilateral" :
            myTriangle.isRight() == true ? "is right" : "");
    }
}

以下是代码中的一个主要错误:

Triangle.java
构造函数中,您将输入参数分配给字段,而不是字段分配给输入参数

sideA = side1;
sideB = side2;
sideC = side3;
我想你的意思是:

side1 = sideA;
side2 = sideB;
side3 = sideC;
另一件事可能会咬你以后,如果还没有,是浮点比较,正如其他人的评论中提到的。您希望更改如下所示的所有比较:

Math.pow (side1, 2) +  Math.pow (side2, 2) == Math.pow (side3, 2)
Math.abs(Math.pow (side1, 2) +  Math.pow (side2, 2) - Math.pow (side3, 2)) < EPSILON
要进行如下比较:

Math.pow (side1, 2) +  Math.pow (side2, 2) == Math.pow (side3, 2)
Math.abs(Math.pow (side1, 2) +  Math.pow (side2, 2) - Math.pow (side3, 2)) < EPSILON
Math.abs(Math.pow(side1,2)+Math.pow(side2,2)-Math.pow(side3,2))

您可以将
ε
定义为一些非常小的常数,例如
1E-20

值与
=
进行比较不是一个好方法,除非您计划只使用精确的值(并且在任何情况下都不适用于
Math.pow(..)==Math.pow(..)
),而不是
if(条件)返回true;否则返回false
您只需编写
返回条件…是的,这肯定会导致问题。还有另一个非常严重的错误-即isTriangle中的每个
|
都应该是
&&
-但是您发现的错误是具有OP描述的症状的错误。这似乎使它在我刚才尝试的简单情况下正常工作
(3,4,5)
(2,2,2)
。我同意,如果输入真正的浮点,双重比较可能会中断。我以前有side1=sideA,但丢失了我的文件并复制了与我一起工作的其他人的代码,但没有意识到他将其向后复制,而不是&&这只是试验性的,以查看输出是否更改,并忘记将其更改回去。Math.abs是什么意思?为什么使用epsilon?有没有一种方法可以附加和发布pdf,这样您就可以看到分配的内容了?@user3440443,
Math.abs
是绝对值函数。代替直接比较,我们取一个差的绝对值,检查它是否小于一些非常小的数字,因为计算机在计算和比较小数(即浮点数)时不精确。好的。谢谢你的意见。它工作得很好,并且为我们应该测试的赋值中列出的值生成相同的输出。