Unity的精度问题(double)
double
类型的比较
double.Epsilon
是 double
类型的最小非零值,表示 double
类型能够表示的最小的差异。Mathf.Approximately
是针对 float
类型的,如果你需要比较 double
类型的浮点数,可以用 Math.Abs
和 double.Epsilon
来实现。
示例:使用 double.Epsilon
进行比较
public static bool Approximately(double a, double b)
{
return Math.Abs(a - b) < double.Epsilon;
}
精度:
double.Epsilon
的值大约是4.9406564584124654E-324
,比float.Epsilon
更小。这意味着double
类型的误差范围比float
类型要精细得多。
示例:
double a = 0.1 + 0.2;
double b = 0.3;
if (Math.Abs(a - b) < double.Epsilon)
{
Console.WriteLine("a ≈ b");
}
else
{
Console.WriteLine("a ≠ b");
}
double
精度的实现:
如果你需要更精确的比较(例如不是 double.Epsilon
这么小的容差),你可以调整容差的大小。例如,可以设置一个更大的容差值,而不是使用 double.Epsilon
,来允许一定范围内的误差:
public static bool Approximately(double a, double b, double tolerance = 1E-10)
{
return Math.Abs(a - b) < tolerance;
}
解释:
- 在这个例子中,
tolerance
默认是1E-10
,这意味着只有当两个数值的差异小于1E-10
时,才会认为它们“接近”相等。你可以根据需要调整容差的大小。
总结:
- 对于
double
类型,你可以使用Math.Abs(a - b) < double.Epsilon
来进行比较,double.Epsilon
的值非常小,适合用来处理非常精细的浮点数比较。 - 如果你希望更灵活的容差比较,可以调整容差值(如
1E-10
)来满足实际需求。