Java 内角的余弦定律

Java 内角的余弦定律,java,math,trigonometry,Java,Math,Trigonometry,我试图用Java创建一个程序,当用户输入边长时,计算任何三角形的内角。我见过一些类似的问题,但我的问题无法解决 我想用这个来计算角度,但它总是给我错误的答案,或者不是一个数字(NaN)。我试着把它全部放在一个等式中,以防它只是四舍五入的错误,但它给出了相同的答案。后来我又把它改成这种格式,使它更容易阅读 public class Triangles { // variables already declared and user inputs double sideOne, sideTw

我试图用Java创建一个程序,当用户输入边长时,计算任何三角形的内角。我见过一些类似的问题,但我的问题无法解决

我想用这个来计算角度,但它总是给我错误的答案,或者不是一个数字(NaN)。我试着把它全部放在一个等式中,以防它只是四舍五入的错误,但它给出了相同的答案。后来我又把它改成这种格式,使它更容易阅读

public class Triangles
{
    // variables already declared and user inputs double sideOne, sideTwo, sideThree  
    threeSq=sideThree*sideThree;
    twoSq=sideTwo*sideTwo;
    oneSq=sideOne*sideOne;

    public static double getAngleOne(double oneSq, double twoSq, double threeSq, double sideOne, double sideTwo, double sideThree)
    {
        double angOne;
        angOne = (oneSq + twoSq - threeSq) / (2 * sideOne * sideTwo);
        angOne = Math.toRadians(angOne);
        angOne = Math.acos(angOne);
        angOne = Math.toDegrees(angOne);
        return angOne;
    }

    public static double getAngleTwo(double oneSq, double twoSq, double threeSq, double   sideOne, double sideTwo, double sideThree)
    {
        double angTwo;
        angTwo = (twoSq + threeSq - oneSq) / (2 * sideTwo * sideThree);
        angTwo = Math.toRadians(angTwo);
        angTwo = Math.acos(angTwo);
        angTwo = Math.toDegrees(angTwo);
        return angTwo;
    }

    public static double getAngleThree(double oneSq, double twoSq, double threeSq, double   sideOne, double sideTwo, double sideThree)
    {
        double angThree;
        angThree = (oneSq + threeSq - twoSq) / (2 * sideOne * sideThree);
        angThree = Math.toRadians(angThree);
        angThree = Math.acos(angThree);
        angThree = Math.toDegrees(angThree);
        return angThree;
    }
} 
我用的是余弦定律,但它没有给我正确的答案。例如,当我输入边长为3、3和3时,它给出71.68993312052173;当我输入5、6和7(分别为1、2和3边)时,我得到NaN

编辑: 谢谢你的建议,我把所有整数都改成了双整数,我的数学就是问题所在(忘记了oneSq+twossq-threeSq的括号)


我提出了完整的修改代码,但它仍然给出了错误的答案,对于一个所有边都相同的三角形,三个边都应该返回60,但返回89.49999365358626

除了不使用双倍值之外,您的计算可能不正确

根据余弦定律

cosγ=(a^2+b^2-c^2)/2ab

所以改变ang=oneSq+threeSq-twossq/(2*sideOne*sideThree);到


在修正了比率的计算之后,仍然有一件事要做:丢掉这些线

angOne = Math.toRadians(angOne);  
此时,angOne不包含任何角度。如果边服从三角形不等式,angOne应该在该点包含一个介于-1和1之间的数字,而不需要转换


等边三角形的面积比为0.5。转换为弧度、acos、转换为度的操作可以组合为

M*acos(x/M) = M*(pi/2-asin(x/M)),
当乘数M=180/pi时。由于x/M很小,因此结果约为

M*(pi/2-x/M)=90-x, 
最终得出接近89.5的值,如上次试验中获得的值



当然,期望的结果是M*acos(0.5)=M*(pi/3)=60。

首先,您使用的是整数,这意味着您将得到整数算术。也就是说,您应该使用
double
而不是
int
@EsaLakaniemi-也可以使用
double
,因为这就是trig函数所使用的。我对Java中的trig函数不是最新的(没有真正使用过它们)-感谢您提到这一点。请看我的回答,您正在执行一个不必要的除法,大约60,这将ACO的结果限制在接近90°。
M*(pi/2-x/M)=90-x,