Oracle数据类型:有关选择NUMBER与BINARY DOUBLE的建议吗?

ggk*_*ath 5 c java database oracle

我正在生成一个在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一样大(或小)的值.

因此,我的帖子.

Per*_*ion 5

来自Oracle的文档:

对于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中的数据类型FLOAT和DOUBLE.

根据您不是在数据库中进行数字处理的事实,并且正在寻求高精度检索 - 我认为Number是更好的数据类型.


Jör*_*ann 5

对于你的用例,我认为BINARY DOUBLE可能是更好的匹配.虽然NUMBER可以支持更高的精度,但在插入和获取时会涉及额外的转换.

如果你还需要支持特殊的IEEE754数字,如正/负无穷大或NaN那么肯定需要BINARY DOUBLE而不是NUMBER.以下内容来自10.2的数据类型oracle文档

在NUMBER列中,浮点数具有小数精度.在BINARY_FLOAT或BINARY_DOUBLE列中,浮点数具有二进制精度.二进制浮点数支持特殊值无穷大和NaN(不是数字).

但请注意,它不支持正零和负零之间的区别:

新数据类型在以下方面不符合IEEE754:

  • -0被强制为+0.
  • 不支持与NaN比较.
  • 所有NaN值都强制为BINARY_FLOAT_NAN或BINARY_DOUBLE_NAN.
  • 不支持非默认舍入模式.
  • 不支持非默认异常处理模式.