1

我正在开发一个计算器应用程序,它也允许在单位之间进行转换。为此,我想提供的功能不仅可以在任意(测量)单位之间进行转换,还可以在任意复合单位之间进行转换,km/h例如m/s. 首先,让我从我的结构开始,以便您了解设置。

我在配置文件中指定了所有单位和转换,以便用户可以使用更多单位扩展系统。文件的整体布局(此处打包为一个)如下所示:

# This is a comment.

# Unit declaration
# Name    Dimension   Aliases
meter     1           Metre, metre, m
foot      1           ft, feet
second    1           s,sec
hour      1           h

# Prefix
# Name    Alias    Base    Exponent
centi     c        10      -2
kilo      k        10      3

# Conversion
foot    30.48cm
hour    3600sec

然后将这些都包装到类型/对象中进行处理。完全实现了在任意单元之间查找“跳跃”,这意味着系统已经可以找到在没有分配直接转换的单元之间转换的路径。例如,我只能将一小时指定为 60 分钟,将一分钟指定为 60 秒,系统可以将 1 小时转换为 3600 秒。这一切都在起作用。前缀支持也完全正常工作。

我的问题始于不包含简单因素的单位转换,例如温度转换:

celsius     (x * (9/5) + 32)°F
fahrenheit  ((x - 32) * (5/9))°C

正如你所看到的,我已经有了一个系统,它允许将任意公式作为转换与x正在转换的数字一起放置。现在,主要问题是复合单位,例如当我想转换km/hft/s. 我目前的方法如下(警告,不适合胆小的人)

  1. 将复合单元拆分为其组件:kmand h, ftands
  2. 将单位相互匹配:kmft,h ands`
  3. 从这一点推导出一个公式:
    1. 将所有前缀单位转换为其基数:km1000m
    2. 获取单位之间的转换因子并将其放入公式中。

这产生((1 * 1000) * 3.28) / (3600)了一个推导公式和一个0.911...大致的因子,然后我用它来将给定的值转换为ft/s. 到目前为止,一切顺利。

现在,当我们回想温度转换时,整个方法就崩溃了,因为我1在公式中使用了值。假设我想转换C/sF/h我目前正在推导公式(1 * (9/5) + 32) / (0.0002777)并使用结果因子进行转换,这显然是错误的。

9我的第二种方法是在每次单位转换时插入值(假设),这给了我(9 * (9/5) + 32) / (9 * 0.0002777),这也不是正确的做法。我的意思是,这种温度转换的情况也复杂得多。所以我这边还有一定的知识差距。

我在这里很茫然,很难找到资源或解决这个问题的方法。有人可以阐明如何正确执行此操作吗?

4

1 回答 1

1

我不确定如何确切地解决您的问题,但这是我的想法,出了什么问题。

一般来说,您的方法似乎工作正常。问题是温度可能是一个特例。实际上会F/hC/s代表什么?我认为物理学中没有这样的概念。您可能想到的是温度随时间的变化,这将是(delta C) / hdelta C我相信您的转换公式delta F如下所示:(x1 * (9/5) + 32) - (x2 * (9/5) + 32) = (x1-x2)*(9/5). 然后您可以在公式中使用它来转换复杂单位。

如果还有更多像这样的案例,我不能说,您还必须检查其他具有奇怪转换率的单位。

我希望这足够有帮助,并将指导您解决问题。

于 2020-02-13T09:32:44.457 回答