C#中的测量单位转换逻辑

5
我正在为我的程序添加一个功能,用户可以随时更改他们的计量单位,并使程序重新计算他们的输入和输出。
例如,如果用户输入20磅的物品,然后决定改用公斤工作,他可以随时选择这个选项,程序会将他的20磅输入重新计算为9千克。然后,如果他决定使用盎司工作,它会将那9千克转换为320盎司等等。
最有效和高效的方法是什么?我一直在想如何实现正确的公式。
4个回答

16

在所有计算中使用标准单位(或您喜欢的单位)。

  • 将用户输入从其所需的任何单位转换为标准单位。
  • 使用标准单位执行计算。
  • 将答案转换回用户想要的单位。

只有用户界面需要关心单位转换,其余代码无需担心。


我同意。不要从之前的单位进行转换,否则会失去精度。 - James Westgate
2
否则你的着陆器要么会超过目标并飞向太空,要么会在表面上猛烈爆炸!;) - FrustratedWithFormsDesigner
4
我建议在你的数据库(或者你存储数据的任何地方)使用国际单位制(SI单位制)来存储信息。 - msarchet
1
我之前写了一个测试,确实是这样操作的,但是我正在为添加此功能的人提供服务,他声称希望代码执行所有转换(而不仅仅是为接口进行转换)。很高兴知道我没有完全错 :) 非常感谢你们的帮助。 - EvanRyan
1
如果您在标准单位中进行所有计算,则所有输入和输出都必须进行转换,否则会丢失精度,除非用户恰好在标准单位中工作。如果您在用户的工作单位中执行所有计算,则只需在他们更改单位时进行转换。 - Gabe

5

将值以已知的度量单位内部存储(例如,将所有内容都存储为千克),并具有将已知单位转换为其他所有单位的方程。

基本上,您只需要转换显示的单位,所有内部计算都可以在单个单位中完成。

作为一个曲线球,如果您想尝试一些前沿的东西,F#具有强大的UoM机制内置...


0
在我曾经工作的一个程序中,我们在“Units”命名空间下有单独的类,例如Units.Torque或Units.Length。
如果您创建一个类似于Units.Weight的类,并将所有转换因子作为const值和可能的单位作为枚举,则可以调用该类并转换为所需的单位。这是我们使用的系统的一个非常基本的示例:
namespace Units
{
    class Weight
    {
        public enum WeightType
        {
            kg,
            lb
        }

        const double kgTolbs = 2.20462262;

        public static double Convert(double value, WeightType fromUnits, WeightType toUnits)
        {
            //Code here to convert units
        }
    }
}

通过这个结构,您可以随意地在各种单位类型之间进行转换。


0
我们刚刚正式发布了我们的轻量级测量和数据类型转换库UnitOf,适用于C#(也适用于Java和JavaScript),可以在不需要知道任何转换因子的情况下完成您所需的操作。您可以声明一个无状态的UnitOf.Mass变量,从而允许您转换到任何单位或仅执行单行转换:
//As a stateless variable
UnitOf.Mass unit = new UnitOf.Mass() .FromPounds(20);
double kilograms = unit.ToKilograms();  //9.07184
double ounces = unit.ToOuncesUS();  //319.99973897268154

//As one liners
double kilogram  = new UnitOf.Mass().FromPounds(20).ToKilograms();  //9.07184
double ounces = new UnitOf.Mass().FromPounds(20).ToOuncesUS();  //319.99973897268154

质量只是 UnitOf 中可用的 20 种测量之一,UnitOf 也是免费且开源的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接