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