Oracle float 与数字

标签 oracle types numbers floating-point fixed-point

我在 Oracles documentation 中看到有冲突的引用.小数如何存储在 FLOAT 和数据库中的 NUMBER 类型之间有什么区别吗?

正如我从 C 等人中记忆的那样,浮点数具有 int 没有的精度限制。例如,对于“浮点数”,0.1(以 10 为底)近似为 0.110011001100110011001101(以 2 为底),大致等于 0.100000001490116119384765625(以 10 为底)。然而,对于 'int's,5(Base 10) 正好是 101(Base 2)。

这就是为什么以下内容不会在 C 中按预期终止的原因:

float i;
i = 0;
for (i=0; i != 10; )
{
    i += 0.1
}

但是我看到 elsewhere in Oracle's documentation该 FLOAT 已被定义为 NUMBER。而且据我了解,Oracle 对 NUMBER 类型的实现并没有遇到与 C 的浮点数相同的问题。

那么,这里的真实故事是什么? Oracle 是否偏离了我对浮点数/浮点数的预期?

(我敢肯定,对于我将使用它们的用途而言,这是一场巨大的飓风,但我知道如果 0.1*10 等于 1.00000000000000001,我会有疑问)

最佳答案

甲骨文BINARY_FLOAT像 C 和许多其他语言一样,使用 IEEE 754 浮点表示在内部存储数据。当您从数据库中获取它们并通常将它们存储在宿主语言的 IEEE 754 数据类型中时,它能够在不转换值的情况下复制值。

而甲骨文的FLOAT数据类型是ANSI SQL NUMERIC 数据类型的同义词,在Oracle 中称为NUMBER。这是一个精确的数字,一种不具有 IEEE 754 舍入行为的缩放十进制数据类型。但是如果您从数据库中获取这些值并将它们放入 C 或 Java 浮点数中,则在此步骤中您可能会丢失精度。

关于Oracle float 与数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/332492/

相关文章:

mysql - 应用程序使用数据库授权和验证用户

sql - 按周分区 - Oracle 数据库

c++ - 在 C++ 中存储任意对象的列表

objective-c - 自定义 UTI 未在 App 中打开

python - 两个数字并打印从第一个数字到第二个数字的列表

sql - Oracle regexp_substr - 如何提取不包括标记字符的文本

mysql - 了解 GROUP BY 子句

reactjs - 如何在 Typescript 中为 React useReducer Hook 操作创建类型定义?

java - 正则表达式捕获符号前后的数字

java - 为什么 totalpay 加起来不正确?