我正在创建一个包含各种单元及其相互关系的数据库模型。例如,36 英寸 = 3 英尺 = 1 码 = 0.9144 米等。该表还可以存储以盎司、磅、千克、克、厘米和各种测量单位表示的杯子。
你是如何做到这一点的?我在想这样的事情:
金额 |单位 |转换系数|换算单位 1 |脚| 12 | 12英寸 1 |院子| 36 | 36英寸
但坦率地说,这似乎是一个糟糕的主意。试图计算出一码有多少英尺会非常复杂,而且我认为我无法存储我需要的所有转换。
还有哪些其他想法?我知道这是一个已解决的问题。谢谢!
存储转换为 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
为您感兴趣的每个维度选择一个基本单位(阅读该维基页面,它会很有用)。例如,如果大部分数据采用 SI 单位,则您可以选择千克表示质量、秒表示时间、米表示距离等。如果您的大部分数据采用美国单位,请从美国习惯单位中选择单位,例如磅代表质量,英尺代表长度,秒代表时间。
然后,对于您希望能够处理的每个实际单位,将转换系数存储为尺寸合适的基本单位。因此,如果您选择英尺作为距离的基本单位,请存储
Unit Dimension Factor
Foot Distance 1
Metre Distance 3.28084
Mile Distance 5280
要实际进行转换,检查尺寸是否匹配后,只需乘以源单位的
Factor
,然后除以目标单位的 Factor
。例如,要从米换算为英里,请乘以 3.28084,然后除以 5280。
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
我认为原始帖子提出的模式很好,除了不包括类(如 Seth 的答案) - 你不想尝试在品脱和英寸之间进行转换。
在两个单位都不是转换单位的情况下进行转换,只需检索两个单位的转换记录并将一个因子除以另一个因子即可实现(例如 36/12 = 3 英尺一码)。
如果您特别关心准确性,您可以确保给定类别的所有单元都包含同一类别中所有其他单元的条目 - 不过,这让我觉得有点矫枉过正。
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()
结束子