UnitsNet
UnitsNet copied to clipboard
Quantity.Equals(Quantity other, Quantity tolerance) gives false negative due to floating-point arithmetic
Describe the bug
The current implementation of e.g. Length.Equals(Length other, Length tolerance)
can lead to false negatives at the boundaries of the tolerance (for instance when comparing a
with a - tolerance
).
To Reproduce
var tolerance = Length.FromMillimeters(0.5);
var length = Length.FromMeters(0.1);
Assert.True((length - tolerance).Equals(length, tolerance));
The assert fails, which makes sense if you rephrase it as
Assert.True(((length - tolerance) - length).Abs() <= tolerance);
which also fails as
((length - tolerance) - length).Abs().Millimeters == 0.50000000000000044
due to floating-point arithmetic.
Expected behavior That the above Assert with Equals returns true.
Additional context Tried it with UnitsNet 4.132.0, 5.43.0 and on the current master branch (1b3647fc1c32cbe737c07beca60ffa65c9c3d477).
This seems similar to #1367 , let's discuss there for now.
Closing this as by design for now, this is just how floating point works. Monitor #1377 for a possible fix on this using fractions.