关于浮点数判断时的误差问题
在做关于浮点数的计算时,不要使用 ==
来做判断,因为无法避免误差。
不要使用:
1 2 3 4 5 6 7 8 9
| var testresult:float = 1 - 0.8f; if(testresult == 0.2f) { Debug.Log(message:"equal"); } else { Debug.Log(message:"not equal"); }
|
而是:
1 2 3 4 5 6 7 8 9 10 11 12
| private bool WithinErroeMargin(float left, float right) { return Mathf.Abs.(f: left = right) <= 0.0001f; } if(WithinErrorMargin(left: testresult, right: 0.2f)) { Debug.Log(message:"WithinErrorMargin equal"); } else { Debug.Log(message:"WithinErrorMargin not equal"); }
|
当需要浮点数转换时,尽量避免强制转换产生的精度丢失,常用的库有:
1 2
| bool equal = Mathf.Approximately(1.0f, 10.0f / 10.0f);
|
1 2 3
| Mathf.RoundToInt(f:1.9f); Mathf.FloorToInt(f:1.9f); Mathf.CeliToInt(f:1.9f);
|