我正在生成一个科学应用程序,它在Java和C中执行大量的数字处理,准确性至关重要。在Oracle数据库中没有完成数字运算(它仅用于在数学计算之间存储变量)。
我为所有Java和C变量使用了双精度数据类型,这些变量主要基于IEEE 754.因此,写入数据库然后从数据库中读出的数据都来自双C或Java中的精度数据类型。
您建议我用什么来存储Oracle中的双精度数据 - NUMBER或BINARY DOUBLE?
例如,假设我有一个名为X_Java
的变量,我将其作为变量X_DB
写入数据库,作为BINARY DOUBLE。如果我要从数据库中将这些数据读回Java并将其存储在变量X_Java2
中,那么X_Java
是否与X_Java2
完全匹配?
我将X_DB
作为NUMBER存储在数据库中会有什么变化?
更新1:请注意,我的“准确度”基准是数据库中读取的数字与在数据库中写入数据之前可用的数字的接近程度。
一方面,我认为如果在写入INTO数据库之前可用的数字是基于IEEE 754,那么用于在数据库中存储该值的数据类型应该是完全匹配的,如果该数据类型是也基于IEEE 754.
另一方面,由于64位(双精度)数字只能精确地存储精度的16位(有时17位),因此在数据库中以38位精度存储为NUMBER应准确地映射和精度加倍。一个缺点是NUMBER数据类型不能存储为BINARY DOUBLE的大(或小)值。
因此,我的帖子。
答案 0 :(得分:5)
来自Oracle's文档:
对于 数字 数据类型:
NUMBER数据类型存储固定和浮点数。数字 实际上可以存储任何数量级,并保证便携 在运行Oracle数据库的不同系统中,最多38位数 精确。 ... Oracle保证数字的可移植性 精度等于或小于38位。
对于 Binary Double / Float 数据类型:
Oracle数据库专门为其提供两种数值数据类型 浮点数:BINARY_FLOAT和BINARY_DOUBLE。他们支持 NUMBER数据类型提供的所有基本功能。 但是,虽然NUMBER使用小数精度,BINARY_FLOAT和 BINARY_DOUBLE使用二进制精度。这样可以更快地运算 计算并通常会降低存储要求。
BINARY_FLOAT和BINARY_DOUBLE是近似数值数据类型。他们 存储十进制值的近似表示,而不是精确的 表示。例如,值0.1不能精确 由BINARY_DOUBLE或BINARY_FLOAT表示。他们是 经常用于科学计算。他们的行为很相似 到Java和XMLSchema中的数据类型FLOAT和DOUBLE。
根据您在数据库中没有进行数字处理的事实以及正在寻求高精度检索的事实 - 我认为 Number 是更好的数据类型。
答案 1 :(得分:5)
对于你的用例,我认为BINARY DOUBLE可能是更好的匹配。虽然NUMBER可以支持更高的精度,但在插入和提取时会涉及额外的转换。
如果您还需要支持特殊的IEEE754数字,如正/负无穷大或NaN,那么肯定需要BINARY DOUBLE而不是NUMBER。以下内容来自oracle documentation on datatypes for 10.2
在NUMBER列中,浮点数具有小数精度。在BINARY_FLOAT或BINARY_DOUBLE列中,浮点数具有二进制精度。 二进制浮点数支持特殊值无穷大和NaN(不是数字)。
但请注意,它不支持正零和负零之间的区别:
新数据类型在以下方面不符合IEEE754:
- -0被强制为+0。
- 不支持与NaN比较。
- 所有NaN值都被强制为BINARY_FLOAT_NAN或BINARY_DOUBLE_NAN。
- 不支持非默认舍入模式。
- 不支持非默认异常处理模式。
答案 2 :(得分:1)
为什么不将它们存储为两列值?对于每个数字存储,NUMBER列中的尾数和BINARY_FLOAT或BINARY_DOUBLE列中的指数。这给你最大。精度(不精确)和幅度范围。当您需要使用该数字时,从表中检索这两个值并重新组合"使用您的JAVA / C代码将它们分成一个数字。
答案 3 :(得分:0)
与前面提到的PLS_INTEGER类似,Oracle 10g中的BINARY_FLOAT和BINARY_DOUBLE类型使用机器算法并且需要更少的存储空间,这两者都使它们比NUMBER类型更有效