Some common problems that you may encounter when comparing different double values are the caveats involved with floating-point arithmetic. Because of the way computers store floating-point numbers, under certain conditions your value will be an approximate of the actual decimal number you wanted. If this situation arises in your code, your comparison logic may not execute as you had intended even if your logic was mathematically sound on paper. To address this issue you will need to use a range comparison that takes into account the slight differences in the least significant digits of the floats.
For example, under normal mathematics we would assume double x is equivalent to double y.
double x = 90.10; double y = 100 * 0.9010; Print(“double x: ” + x); Print(“double y: ” + y);
double x = 90.1 double y = 90.1
bool c = (x == y); Print(“x equals y: ” + c);
x equals y: False
if (x == y) // Do something. This will never be true.
if (Math.Abs(x – y) < 0.0001) // Do something
Alternatively, you can check the difference between the two variables against the double.Epsilon field. double.Epsilon field represents the smallest possible double value.
if (x – y < double.Epsilon) // Do something
double newPriceRange = Close[0] - Open[0]; double oldPriceRange = Close[1] - Open[1]; if (Instrument.MasterInstrument.Compare(newPriceRange, oldPriceRange) == 1) { // Do something }
For a more formal analysis of floating-point arithmetic, there are many resources online: