在java中三角形总是表示为等边
我不知道出了什么问题,但我的输出确定三角形有边1.0、1.0、1.0,并且总是等边的在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) {
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
是绝对值函数。代替直接比较,我们取一个差的绝对值,检查它是否小于一些非常小的数字,因为计算机在计算和比较小数(即浮点数)时不精确。好的。谢谢你的意见。它工作得很好,并且为我们应该测试的赋值中列出的值生成相同的输出。