【问题标题】:Why does Float column in Oracle gets automatically rounded-off?为什么 Oracle 中的 Float 列会自动四舍五入?
【发布时间】:2016-11-15 17:23:57
【问题描述】:

为什么在 Oracle 中定义的数据类型为 Float 的列会自动四舍五入?

列被创建为 FLOAT(5)。 "TRK_TARE" FLOAT(5)

示例(输入的值 -> 保留的最终值)-:

     123 -> 120
    1237 -> 1200    
   12347 -> 12000  
  123457 -> 120000  
 1234567 -> 1200000 
12345678 -> 12000000

FLOAT 和 NUMBER 有什么区别。

注意:此列上没有对触发器的修改

【问题讨论】:

  • FLOAT 和 NUMBER 的区别在于,在 Oracle 中几乎所有情况下都应该使用 NUMBER(不一定在任何其他语言或数据库产品中),而 FLOAT 是您应该只使用的数据类型如果您有充分的理由这样做。还有其他答案,但这可能是最简单的。

标签: oracle floating-point type-conversion


【解决方案1】:

这是因为the precision of a FLOAT is measured in binary digits,来自文档:

精度为 p 的 NUMBER 数据类型的子类型。 FLOAT 值在内部表示为 NUMBER。精度 p 的范围可以从 1 到 126 个二进制数字。 FLOAT 值需要 1 到 22 个字节。

如果我将 123 转换为 FLOAT(5),我会得到相同的答案:

SQL> select cast(123 as float(5)) from dual;

CAST(123ASFLOAT(5))
-------------------
                120

但是,当转换为 FLOAT(7) 时,结果是 123

SQL> select cast(123 as float(7)) from dual;

CAST(123ASFLOAT(7))
-------------------
                123

一般来说,除非有指定精度的原因,否则不要。

【讨论】:

    【解决方案2】:

    你弄错了类型声明。我建议阅读 Oracle 文档的 this 章节(在“浮点数据类型”部分下)。

    在本例中,返回的float 值不能超过5 个二进制数字。可以用 5 个二进制数字表示的最大十进制数是 31。在您的示例中,该值超过 31。 因此,float 值必须被截断,以使其有效数字不需要超过 5 个二进制数字。例如123四舍五入为120,只有两位有效十进制数字,只需要4位二进制数字。

    Oracle 数据库在内部使用 Oracle FLOAT 数据类型时 转换 ANSI FLOAT 数据。 Oracle FLOAT 可供您使用, 但 Oracle 建议您使用 BINARY_FLOAT 和 BINARY_DOUBLE 数据类型,因为它们更多 强大的。请参阅"Floating-Point Numbers" 了解更多信息。

    【讨论】:

    • 您能解释一下为什么在这段代码 sn-p: create table xx( x float(5) ); insert into xx select level from dual connect by level <= 200; select * from xx; 超过 31 的值不会被截断吗? 1 到 100 之间的值不会被截断,只有大于 100 的值才会被截断。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    相关资源
    最近更新 更多