问题:
编写一个程序,读取用户三角形边长。使用Heron公式比较三角形的面积,其中s代表三角形周长的一半,a,b和c代表三边的长度。
import java.util.Scanner;
public class AreaOfTriangle
{
public static void main(String[]args)
{
Scanner scan = new Scanner(System.in);
final double NUM_ONE = 0.5;
int a, b, c;
double s, area;
System.out.print("Enter side a: ");
a = scan.nextInt();
System.out.print("Enter side b: ");
b = scan.nextInt();
System.out.print("Enter side c: ");
c = scan.nextInt();
s = NUM_ONE * (a + b + c);
area = Math.sqrt(s*(s-a)*(s-b)*(s-c));
System.out.println("\nThe area of the triangle = " + area);
}
}
答案 0 :(得分:4)
公式是正确的,但s*(s-a)*(s-b)*(s-c)
最终可能会略微负面,具体取决于输入(由于浮点不精确)。您应该在获取sqrt
之前对此进行测试,并在该实例中返回零。
Math.sqrt
将返回NaN
。
答案 1 :(得分:3)
因为在某些情况下,您的代码最终会在您的sqrt调用中显示负值:
a = 1;
b = 2;
c = 5;
s = NUM_ONE * (a + b + c);
这里s = 4.0然后你的sqrt参数是4 * 3 * 2 * -1,这是负的
您应该使用Math.sqrt(Math.abs(...))吗?