我正在开发一个计算器应用程序,它也允许在单位之间进行转换。为此,我想提供的功能不仅可以在任意(测量)单位之间进行转换,还可以在任意复合单位之间进行转换,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/h
为ft/s
. 我目前的方法如下(警告,不适合胆小的人):
- 将复合单元拆分为其组件:
km
andh
,ft
ands
- 将单位相互匹配:
km
和ft,
hand
s` - 从这一点推导出一个公式:
- 将所有前缀单位转换为其基数:
km
到1000m
- 获取单位之间的转换因子并将其放入公式中。
- 将所有前缀单位转换为其基数:
这产生((1 * 1000) * 3.28) / (3600)
了一个推导公式和一个0.911...
大致的因子,然后我用它来将给定的值转换为ft/s
. 到目前为止,一切顺利。
现在,当我们回想温度转换时,整个方法就崩溃了,因为我1
在公式中使用了值。假设我想转换C/s
为F/h
我目前正在推导公式(1 * (9/5) + 32) / (0.0002777)
并使用结果因子进行转换,这显然是错误的。
9
我的第二种方法是在每次单位转换时插入值(假设),这给了我(9 * (9/5) + 32) / (9 * 0.0002777)
,这也不是正确的做法。我的意思是,这种温度转换的情况也复杂得多。所以我这边还有一定的知识差距。
我在这里很茫然,很难找到资源或解决这个问题的方法。有人可以阐明如何正确执行此操作吗?