如何为单位转换表建模?

问题描述 投票:0回答:5

我正在创建一个包含各种单元及其相互关系的数据库模型。例如,36 英寸 = 3 英尺 = 1 码 = 0.9144 米等。该表还可以存储以盎司、磅、千克、克、厘米和各种测量单位表示的杯子。

你是如何做到这一点的?我在想这样的事情:

金额 |单位 |转换系数|换算单位
1 |脚| 12 | 12英寸
1 |院子| 36 | 36英寸

但坦率地说,这似乎是一个糟糕的主意。试图计算出一码有多少英尺会非常复杂,而且我认为我无法存储我需要的所有转换。

还有哪些其他想法?我知道这是一个已解决的问题。谢谢!

database modeling
5个回答
10
投票

存储转换为 SI 单位,而不是其他非公制单位。然后您可以在单位之间进行转换,而无需知道显式转换。

Unit         | Class      | Base Unit Multiplier
------------------------------------------------------
foot         | length     | 0.304800610
yard         | length     | 0.914401830
square foot  | area       | 0.092903040
...

所以 14 英尺换算为:

14 feet * 0.304800610 = 4.26720854 meters
4.26720854 meters * 0.914401830⁻¹ = 4.66666667 yards

4
投票

为您感兴趣的每个维度选择一个基本单位(阅读该维基页面,它会很有用)。例如,如果大部分数据采用 SI 单位,则您可以选择千克表示质量、秒表示时间、米表示距离等。如果您的大部分数据采用美国单位,请从美国习惯单位中选择单位,例如磅代表质量,英尺代表长度,秒代表时间。

然后,对于您希望能够处理的每个实际单位,将转换系数存储为尺寸合适的基本单位。因此,如果您选择英尺作为距离的基本单位,请存储

Unit    Dimension    Factor
Foot    Distance     1
Metre   Distance     3.28084
Mile    Distance     5280

要实际进行转换,检查尺寸是否匹配后,只需乘以源单位的

Factor
,然后除以目标单位的
Factor
。例如,要从米换算为英里,请乘以 3.28084,然后除以 5280。


3
投票
CREATE TABLE UnitConversion
(
    [FromUnit] NVARCHAR(100),
    [ToUnit] NVARCHAR(100),
    [FromOffset] DECIMAL(29,10),
    [Multiplicand] DECIMAL(29,10),
    [Denominator] DECIMAL(29,10),
    [ToOffset] DECIMAL(29,10)
)

ToUnit = (FromUnit + FromOffset) * 被乘数 / 分母 + ToOffset


2
投票

我认为原始帖子提出的模式很好,除了不包括类(如 Seth 的答案) - 你不想尝试在品脱和英寸之间进行转换。

在两个单位都不是转换单位的情况下进行转换,只需检索两个单位的转换记录并将一个因子除以另一个因子即可实现(例如 36/12 = 3 英尺一码)。

如果您特别关心准确性,您可以确保给定类别的所有单元都包含同一类别中所有其他单元的条目 - 不过,这让我觉得有点矫枉过正。


0
投票
Private Sub ConvertUnits()
Dim input As Double = Double.Parse(txtInput.Text)
Dim result As Double = 0

Select Case cmbUnit1.SelectedItem.ToString()
    Case "Mg"
        Select Case cmbUnit2.SelectedItem.ToString()
            Case "Mg"
                result = input
            Case "g"
                result = input * 1000
            Case "Kg"
                result = input * 1000000
            Case "Tonne"
                result = input * 1000000000
            Case "Grain"
                result = input * 0.0154324
            Case "Ounce"
                result = input * 28349.5
            Case "Pound"
                result = input * 453592
            Case "Stone"
                result = input * 6350293.18
        End Select
    Case "g"
        ' Code for converting from g to other units
    Case "Kg"
        ' Code for converting from Kg to other units
    Case "Tonne"
        ' Code for converting from Tonne to other units
    Case "Grain"
        ' Code for converting from Grain to other units
    Case "Ounce"
        ' Code for converting from Ounce to other units
    Case "Pound"
        ' Code for converting from Pound to other units
    Case "Stone"
        ' Code for converting from Stone to other units
End Select

lblResult.Text = result.ToString()

结束子

© www.soinside.com 2019 - 2024. All rights reserved.