I am writing unit tests that verify calculations in a database and there is a lot of rounding and truncating and stuff that mean that sometimes figures are slightly off.
When verifying, I'm finding a lot of times when things will pass but say they fail - for instance, the figure will be 1 and I'm getting 0.999999
I mean, I could just round everything into an integer but since I'm using a lot of randomized samples, eventually i'm going to get something like this
10.5 10.4999999999
one is going to round to 10, the other will round to 11.
How should I solve this problem where I need something to be approximately correct?
You can use the == operator, as shown in the following example. int a = GetOriginalValue(); int b = GetCurrentValue(); // Test for value equality. if (b == a) { // The two integers are equal. }
==) operator to check if two numbers are not equal to one another, e.g. a !== b . The strict inequality operator returns true if the numbers are not equal and false otherwise. Copied!
You could provide a function that includes a parameter for an acceptable difference between two values. For example
// close is good for horseshoes, hand grenades, nuclear weapons, and doubles static bool CloseEnoughForMe(double value1, double value2, double acceptableDifference) { return Math.Abs(value1 - value2) <= acceptableDifference; }
And then call it
double value1 = 24.5; double value2 = 24.4999; bool equalValues = CloseEnoughForMe(value1, value2, 0.001);
If you wanted to be slightly professional about it, you could call the function ApproximatelyEquals
or something along those lines.
static bool ApproximatelyEquals(this double value1, double value2, double acceptableDifference)
Define a tolerance value (aka an 'epsilon' or 'delta'), for instance, 0.00001, and then use to compare the difference like so:
if (Math.Abs(a - b) < delta) { // Values are within specified tolerance of each other.... }
You could use Double.Epsilon
but you would have to use a multiplying factor.
Better still, write an extension method to do the same. We have something like Assert.AreSimiliar(a,b)
in our unit tests.
Microsoft's Assert.AreEqual()
method has an overload that takes a delta: public static void AreEqual(double expected, double actual, double delta)
NUnit also provides an overload to their Assert.AreEqual()
method that allows for a delta to be provided.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With