判断浮点数是否相等

关于浮点数判断时的误差问题

在做关于浮点数的计算时,不要使用 == 来做判断,因为无法避免误差。

不要使用:

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;//误差范围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);//2 返回最接近1.9的整数 四舍五入 
Mathf.FloorToInt(f:1.9f);//1 返回小于等于1.9的最大整数 向下取整
Mathf.CeliToInt(f:1.9f);//2 返回大于等于1.9的最小整数 向上取整

判断浮点数是否相等
https://newztx.github.io/2024/02/21/判断浮点数是否相等/
作者
Cranky Dove
发布于
2024年2月21日
许可协议