【问题标题】:Units of measurement conversion logic in C# [closed]C# 中的度量单位转换逻辑 [关闭]
【发布时间】:2010-05-07 21:11:56
【问题描述】:

我正在向我的程序添加一项功能,用户可以随时更改他们的测量单位,并让程序重新计算他​​们的输入和输出。

如果用户输入 20 磅的物品,然后决定改为以公斤为单位工作,他可以​​随时选择一个选项来执行此操作,程序会将他的 20 磅输入重新计算为 9 公斤。然后,如果他决定他宁愿以盎司为单位工作,它会将 9 公斤转换为 320 盎司,以此类推。

解决此问题的最有效和最有效的方法是什么?我一直在绞尽脑汁想找到一种方法来实现正确的公式。

【问题讨论】:

    标签: c# logic measurement


    【解决方案1】:

    以标准单位(或您喜欢使用的单位)进行所有计算。

    • 将用户的输入从他们希望的任何内容转换为标准单位。
    • 使用标准单位进行计算。
    • 将答案转换回用户想要的单位。

    只有用户界面需要关心单位转换。剩下的代码就不用管了。

    【讨论】:

    • 我同意。不要从以前的单位转换,你会失去精度。
    • ...否则你的着陆器要么飞过太空,要么飞入太空,要么以耀眼的火球撞击地面! ;)
    • 我建议使用 SI 单位来存储存储在您的数据库中的信息(或任何您存储数据的地方)。
    • 我已经写了一个测试来做这个确切的事情,但是我添加这个功能的人声称他想让代码做所有的转换(而不是仅仅转换接口)。很高兴知道我并没有完全错 :) 非常感谢你们的帮助
    • 如果您以标准单位进行所有计算,则必须转换所有输入和输出,从而导致精度损失,除非用户碰巧使用标准单位。如果您在用户的工作单位中执行所有计算,则只需在他们更改单位时进行转换。
    【解决方案2】:

    在内部以已知的测量单位存储值(例如,以 kg 为单位存储所有内容),并通过公式将已知单位转换为/从已知单位转换为所有其他单位。

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

    作为一个曲线球,F# 内置了强大的 UoM 机制,如果您想玩一些尖端的东西...

    【讨论】:

      【解决方案3】:

      在我从事的一个程序中,我们在“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
              }
          }
      }
      

      使用这种结构,您可以随意转换为任何单位类型。

      【讨论】:

        【解决方案4】:

        我们刚刚正式发布了用于 C#(也适用于 Java 和 JavaScript)的轻量级测量和数据类型转换库 UnitOf,它可以满足您的要求,而无需知道任何转换因子。您可以声明一个无状态的 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 个测量值中的一个,它也是免费和开源的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-09-21
          • 2013-08-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多