为什么Oracle中的Float列会自动舍入?

时间:2016-11-15 17:23:58

标签: oracle floating-point type-conversion

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

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

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

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

FLOAT& amp;号。

注意:此列上没有对Trigger进行修改

2 个答案:

答案 0 :(得分: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

一般情况下,除非有理由指定精度,否则不要

答案 1 :(得分:0)

你对类型声明有误。我建议阅读Oracle文档的Why does everyone say not to use scanf? What should I use instead?章节(在“Float数据类型”部分下)。

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

  

Oracle数据库在内部使用Oracle FLOAT数据类型   转换ANSI FLOAT数据。 Oracle FLOAT可供您使用,   但Oracle建议您使用   而是BINARY_FLOAT和BINARY_DOUBLE数据类型,因为它们更多   强大的。有关详细信息,请参阅this