UnitsNet icon indicating copy to clipboard operation
UnitsNet copied to clipboard

Quantity.Equals(Quantity other, Quantity tolerance) gives false negative due to floating-point arithmetic

Open AndreasLeeb opened this issue 1 year ago • 1 comments

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).

AndreasLeeb avatar Feb 22 '24 08:02 AndreasLeeb

This seems similar to #1367 , let's discuss there for now.

angularsen avatar Mar 01 '24 20:03 angularsen

Closing this as by design for now, this is just how floating point works. Monitor #1377 for a possible fix on this using fractions.

angularsen avatar Jul 08 '24 13:07 angularsen