C#浮点数加减后未得原值?角度计算精度问题求助
问题排查与解决
首先看你的Debug输出代码,这里有个明显的字符串拼接错误:
Debug.Log("small + big theta teeth: " + smallThetaTeeth + bigThetaTeeth);
在C#中,字符串与数值的拼接是按顺序执行的,这段代码会先把"small + big theta teeth: "和smallThetaTeeth拼接成新字符串,再和bigThetaTeeth拼接,最终输出的是两个数值的字符串连写结果,而非它们的数学和。正确写法需要给加法运算加括号,让数学计算优先执行:
Debug.Log("small + big theta teeth: " + (smallThetaTeeth + bigThetaTeeth));
如果修正后结果仍不符合预期,再排查以下几点:
- Acos输入合法性:检查
(t / 2) / tr的计算结果是否在[-1, 1]范围内。若超出该区间,Mathf.Acos会返回NaN(非数值),导致smallThetaTeeth异常,进而让bigThetaTeeth也出错。可以加日志验证:float acosInput = (t / 2f) / tr; Debug.Log("Acos input: " + acosInput); - 数值精度误差:即使使用
double,浮点数运算也可能存在微小精度偏差(比如2π本身是近似值)。可以允许一定误差范围,比如判断两者之和与dTheta的差值是否小于1e-6(可根据需求调整精度):float sum = smallThetaTeeth + bigThetaTeeth; if (Mathf.Abs(sum - dTheta) < 1e-6) { Debug.Log("Sum matches dTheta (within tolerance)"); } else { Debug.Log("Sum doesn't match: " + sum + " vs " + dTheta); } - 变量类型一致性:确保
d、t、tr都是浮点类型(float或double),若为整数类型,除法会执行整数除法导致结果截断。比如(t / 2)如果t是整数,需改成(t / 2f)来维持浮点运算。
内容的提问来源于stack exchange,提问作者Caleb Reader
相关产品推荐
相关产品推荐

