我究竟做错了什么?我一直在拿NaN? (苍鹭的公式)

时间:2016-03-10 11:11:47

标签: java area

问题:

  

编写一个程序,读取用户三角形边长。使用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);
    }
}

2 个答案:

答案 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(...))吗?