我正在生成一个科学的应用程序,它使用Java和C执行大量的数字处理,并且准确性至关重要。在Oracle数据库中没有进行数字运算(它仅用于在数学计算之间存储变量)。
我的所有Java和C变量都使用了双精度数据类型,这在很大程度上是基于IEEE754。因此,写入数据库然后从数据库中读出的数据都来自C或Java的双精度数据类型。
您建议我使用哪种方法在Oracle中存储双精度数据--数字还是二进制双精度?
例如,假设我有一个名为X_Java的变量,我将其作为变量X_DB作为二进制双精度值写入数据库。如果我将这些数据从数据库读回java语言,并将其存储在变量X_Java2中,X_Java会与X_Java2完全匹配吗?
如果将X_DB作为数字存储在数据库中,情况会发生怎样的变化?
更新1:请注意,我对“准确性”的基准是从数据库中读出的数字与写入数据库之前可用的数字有多接近。
一方面,我认为如果写入数据库之前可用的数字是基于IEEE 754的,那么用于在数据库中存储该值的数据类型应该是完全匹配的,如果该数据类型也是基于IEEE 754的。
另一方面,由于64位(双精度)数字只能准确地存储高达16位(有时为17位)的精度,因此在数据库中以38位精度存储的数字应准确地从双精度映射到双精度。一个缺点是NUMBER数据类型不能存储像BINARY DOUBLE那样大(或小)的值。
因此,我的帖子。
发布于 2012-02-29 22:02:44
对于您的用例,我认为二进制双精度可能是更好的匹配。虽然NUMBER可以支持更高的精度,但在插入和获取时会涉及到额外的转换。
如果您还需要支持特殊的数字,如正/负无穷大或NaN,那么这肯定需要二进制双精度,而不是IEEE754。以下内容来自oracle documentation on datatypes for 10.2
在NUMBER列中,浮点数具有小数精度。在BINARY_FLOAT或BINARY_DOUBLE列中,浮点数具有二进制精度。对于二进制浮点数,支持特殊值infinity和NaN (非数字)。
但是请注意,它不支持正负零之间的区别:
新数据类型在以下方面不符合IEEE754:
使用+0.
发布于 2012-02-29 10:56:09
来自Oracle's文档:
对于Number数据类型:
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中的浮点和双精度数据类型。
基于这样的事实,您没有在数据库中处理数字,并且正在寻求高精度的检索-我认为数字是更好的数据类型。
发布于 2015-04-26 02:00:22
为什么不将它们存储为两个列值呢?对于每个数字,将尾数存储在数字列中,将指数存储在BINARY_FLOAT或BINARY_DOUBLE列中。这就给了你最大。精度(不是精度)和幅度范围。当需要使用数字时,从表中检索两个值,并使用JAVA/C代码将它们“重新组合”为一个数字。
https://stackoverflow.com/questions/9492829
复制相似问题