我正在尝试用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 + twoSq - threeSq)
我提出了完整的修改后的代码,但仍然给出了错误的答案,对于一个三面都相同的三角形,它应该为所有三个返回60,但它返回89.49999365358626。
答案 0 :(得分:2)
在纠正比率的计算之后,仍然有一件事要做:丢掉线
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。
答案 1 :(得分:0)
除了不使用双值外,您的计算可能不正确。
根据余弦法
cosγ=(a ^ 2 + b ^ 2 - c ^ 2)/ 2ab
所以改变ang = oneSq + threeSq - twoSq /(2 * sideOne * sideThree);到
double ang = (oneSq + twoSq - threeSq)*1.0 / (2 * sideOne * sideTwo);