📅  最后修改于: 2023-12-03 15:29:46.583000             🧑  作者: Mango
在 C# 中比较两个数的大小和相等性时,要特别注意数值类型的精度问题。因为在计算机中使用二进制存储浮点数和小数,存在一定的精度误差。下面是在 C# 中进行精度比较的方法和注意事项。
在 C# 中,float 和 double 类型的浮点数会出现精度误差。比如,两个看起来相同的浮点数可能在计算机内的存储格式不同,导致比较结果不同。
为避免浮点数精度误差带来的问题,可以使用以下方法进行比较:
float a = 0.1f;
float b = 0.2f - 0.1f;
bool isEqual = Math.Abs(a-b) < 0.0001;
Console.WriteLine(isEqual); // 输出 true
double a = 0.1;
double b = 0.2 - 0.1;
bool isEqual = Math.Round(a, 2) == Math.Round(b, 2);
Console.WriteLine(isEqual); // 输出 true
在 C# 中比较小数时,可以使用 Decimal 类型。Decimal 类型本质上是一个定点数,没有精度误差。
decimal a = 0.1m;
decimal b = 0.2m - 0.1m;
bool isEqual = a == b;
Console.WriteLine(isEqual); // 输出 true
float a = 3.3f;
float b = 3.3f;
bool isEqual = (a == b); // 可能返回 false
Console.WriteLine(isEqual);
bool isEqual2 = (Math.Abs(a - b) < 0.0001); // 推荐的比较方法
Console.WriteLine(isEqual2);
float x = 1.0f / 81.0f * 81.0f;
float y = 1.0f;
bool isEqual = (x == y); // 可能返回 false
Console.WriteLine(isEqual);
float x2 = 1.0f / 81.0f;
float y2 = x2 * 81.0f;
bool isEqual2 = (x2 == y2); // 推荐的计算方法
Console.WriteLine(isEqual2);
decimal a = 0.1m;
decimal b = 0.2m - 0.1m;
bool isEqual = a == b; // 可能返回 false
Console.WriteLine(isEqual);
bool isEqual2 = Decimal.Equals(a, b); // 推荐的比较方法
Console.WriteLine(isEqual2);
总之,在进行精度比较时,要注意数值类型的特性和精度误差,合理选择比较方法,避免因精度问题引发的错误。