我在 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/