在我们的应用程序中,我们目前仍然承认将所有工程数据存储在SI数据库中的遗留问题。
我担心我们可能会冒险在数据库或.NET数字类型中没有足够的精度和准确性。我也担心我们可能会看到浮点数学的假象(虽然这可能是一个问题本身)。
例如,源数据可能是以Psi(磅/平方英寸)表示的压力量(并从某些第三方服务读入)。工程师将选择这个度量单位,因为(对于表达的数量),这将倾向于提供易于消化的,人类可读的数字而无需科学记数法。
当我们“标准化”数字时,即当我们将此数量转换为我们自己的持久性时,我们可能会将其转换为Pa(帕斯卡),这需要将数字乘以或除以其他可能较大的数字。
我们经常会存储非常大或非常小的数字,更糟糕的是 - 我们可能会对这些数字做进一步的计算。
目前我们使用ORACLE float和System.Double。
人们怎么想这个?
更新
在即将推出的F#语言(我写的CTP中)中发现了Units of Measure support的进一步研究。
似乎我们能够让F#了解用户输入,例如:
9.81<n/s^2> // an acceleration
我们还可以创建自己的衍生单位和单位系统。
(来源:msdn.com)
答案 0 :(得分:6)
记住重要数字 - 测量的准确性。如果PSI只知道整磅,那么在转换为Pa之后有15位小数,仍然只有一个有效数字。
精度与精度不同,在工程单位上执行浮点运算需要在运算期间考虑到这一点 - 不要存储比测量精度更高的精度,不要在计算中使用比精度更高的精度众所周知。
编辑:
您也可以考虑使用NUMERIC(p,s)
,其中可以明确指定精度(位数)和比例(小数点右侧的位数)。
如果这不是一个选项,请考虑保持特定测量的准确性,以便在计算中报告和/或使用它。
答案 1 :(得分:3)
我认为,只要您能够存储的确与您实际拥有的精确度一样,您就没有理由担心。
使用您将PSI转换为帕斯卡(1 PSI = 6 894.75 pa)的示例,如果我测量14.7 PSI并将其转换为帕斯卡,我得到101,352.825。这太精确了。您需要将其存储为101,000以反映测量的实际精度,而不是计算。
请注意,您用于转换的任何数字都必须至少与您的测量值一样精确,这样您才不会在转换过程中失去精确度。在转换因子中,最好使用比测量更多的精度数字(至少一个)。
答案 2 :(得分:2)
我认为工程数据通常不够精确,无法担心差异。你知道工程师的表达“用千分尺测量,用粉笔标记,用斧头切割”。这总结了一下。担心8个有效数字之间的差异,或者在计算现实世界中建立的2个重要数字容差的内容之间的差异是没有意义的。
答案 3 :(得分:1)
为了避免因单位转换而导致的精度损失,您可以将测量得出的所有数据存储在测量单位中。当然这意味着您可能最终将某些压力值存储在Pa中,其他在Psi,甚至mmHg。你必须自己决定是否会引入比解决的问题更多的问题。
我同意其他答案:在大多数情况下,Oracle float提供的精度远远高于测量本身的精度。
答案 4 :(得分:0)
嗯,这取决于你想要的确切程度。记住,在谈论工程时,仅仅存储数字3.20是不够的,因为在工程方面,3.2与3.20不同。 3.20意味着比3.2更高的准确度,其可以 3.15&lt; = x&lt; 3.25