If you’ve worked with variable whose datatypes are “double”, you may have seen a problem when you check if two doubles are equal.
The problem is the way that a double (also called “float”) variable is stored. Doubles sometimes lose accuracy.
So, a variable you think holds “1” actually holds “0.9999999999987423” – or something like that.
Here are two extension methods you can use to compare two double variables, and see if they are “equal enough”.
using System;
namespace Engine
{
public static class ExtensionMethods
{
public static bool IsApproximatelyEqualTo(this double initialValue, double value)
{
return IsApproximatelyEqualTo(initialValue, value, 0.00001);
}
public static bool IsApproximatelyEqualTo(this double initialValue, double value, double maximumDifferenceAllowed)
{
// Handle comparisons of floating point values that may not be exactly the same
return (Math.Abs(initialValue - value) < maximumDifferenceAllowed);
}
}
}
These functions subtract the second value from the first, get the absolute value (converting negative differences to a positive number), and check if the difference between the two numbers is less than a value you consider to be acceptable for declaring the variables “equal”.
Here is how you would use it in your code:
public void Test()
{
double var1 = 1.0;
double var2 = 9999999999987423;
// Default level of accuracy
if(var1.IsApproximatelyEqualTo(var2))
{
// Do stuff
}
// Less restrictive level of accuracy
if(var1.IsApproximatelyEqualTo(var2, 0.01))
{
// Do other stuff
}
}
The default value has always worked for the situations I’ve encountered, but you may see something different in your programs, and want to use your own level of accuracy.