三角形角度计算遇NaN问题求助:等腰/等边三角形计算失效
问题分析与修复方案
核心错误:余弦定理运算顺序错误
你的calcAngleC方法中,余弦定理的公式因缺少括号导致运算逻辑完全错误:
原错误代码:
angleC = Math.acos((Math.pow(sidea,2) + Math.pow(sideb,2) - Math.pow(sidec,2)) / 2 * sidea * sideb);
根据余弦定理,正确公式应为:
$$\cos C = \frac{a^2 + b^2 - c^2}{2ab}$$
但你的代码中,/ 2 * sidea * sideb会先执行除法再执行乘法,实际计算的是$\frac{a^2 + b^2 - c^2}{2} \times a \times b$,这个结果会远远超出Math.acos()的定义域[-1, 1],因此返回NaN。不等边三角形3,4,5只是巧合让错误结果落在定义域内,而等腰/等边三角形的计算结果会完全越界,导致报错。
修复步骤
1. 修正余弦定理公式
给分母部分添加括号,确保先计算2 * sidea * sideb:
public void calcAngleC() { double numerator = Math.pow(sidea, 2) + Math.pow(sideb, 2) - Math.pow(sidec, 2); double denominator = 2 * sidea * sideb; angleC = Math.acos(numerator / denominator); }
2. 统一角度存储逻辑
当前angleA存储的是度数,而angleB、angleC存储的是弧度,容易混淆。建议统一存储弧度,输出时再转换为度数:
public void calcAngleA() { // 三角形内角和为π弧度(等价于180度) angleA = Math.PI - angleB - angleC; }
然后修改printStats方法,统一转换角度:
public void printStats() { System.out.printf("\nSide A: %1.2f", sidea); System.out.printf("\nSide B: %1.2f", sideb); System.out.printf("\nSide C: %1.2f", sidec); System.out.printf("\n\nAngle A: %1.2f%1s", Math.toDegrees(angleA), (char)176); System.out.printf("\nAngle B: %1.2f%1s", Math.toDegrees(angleB), (char)176); System.out.printf("\nAngle C: %1.2f%1s", Math.toDegrees(angleC), (char)176); }
3. 可选:添加输入合法性检查
为避免无效边长(不满足三角形三边关系)导致的计算错误,可在构造函数中添加校验:
public Triangle() { setSideA(); setSideB(); setSideC(); if (!isValidTriangle()) { System.err.println("Error: Invalid triangle sides (sum of any two sides must be greater than the third)."); System.exit(1); } angleA = 0; angleB = 0; angleC = 0; } private boolean isValidTriangle() { return (sidea + sideb > sidec) && (sidea + sidec > sideb) && (sideb + sidec > sidea); }
测试验证
修复后,测试以下用例:
- 等边三角形(5,5,5):三个角均为60°
- 等腰三角形(5,10,10):角A≈28.96°,角B≈角C≈75.52°
- 直角三角形(3,4,5):角C≈90°,角A≈36.87°,角B≈53.13°
所有用例均可正常计算出正确角度。
内容的提问来源于stack exchange,提问作者oxiiacid
相关产品推荐
相关产品推荐

