angularsen / UnitsNet

Makes life working with units of measurement just a little bit better.
https://www.nuget.org/packages/UnitsNet/
MIT No Attribution
2.63k stars 383 forks source link

Negative stones and pounds conversion wrong under 1 stone #572

Closed rickyoleary closed 5 years ago

rickyoleary commented 5 years ago
using System;
using UnitsNet;

public class Program
{
    public static void Main()
    {
        double onePoundInKg = 0.45;
        double twoPoundsInKg = 0.90;

        Console.WriteLine(Mass.FromKilograms(onePoundInKg - twoPoundsInKg).StonePounds.ToString()); // -1 st -1 lb
    }
}

Fiddle here.

I'd expect this to show -0 st -1lb but currently displays -1 st -1 lb. P.S Love the library, thanks!

angularsen commented 5 years ago

Thanks for reporting, would you be interested in debugging this and doing a pull request? I will be happy to assist.

rickyoleary commented 5 years ago

I'm now looking into it, but have to be honest that units/math is not my strongest point, hence the use of this library for my project, so I'm not sure how much help I can be.

angularsen commented 5 years ago

Just ask if you get stuck on something you don't understand.

I recommend starting with

https://github.com/angularsen/UnitsNet/blob/master/UnitsNet.Tests/CustomCode/StonePoundsTests.cs

and adding a new test case as you wrote above, then debug why it fails by stepping through the code calls. You should be able to spot where it goes wrong. Use some values that are easy to reason about. My gut feeling tells me we have a rounding-error, so it rounds stones "down" to a more negative value than it should, since we have only tested positive values before.

tmilnthorp commented 5 years ago

Bad math using Math.Floor on negative numbers. Was also incorrect for feet/inches. Fix in PR #573.

angularsen commented 5 years ago

Fixed in #573 (master) and #574 (v4).

angularsen commented 5 years ago

Nuget 3.111 on the way out. https://github.com/angularsen/UnitsNet/releases/tag/UnitsNet%2F3.111.0