为什么Oracle中定义的数据类型为Float的列会自动舍入?
列创建为FLOAT(5)。 " TRK_TARE" FLOAT(5)
示例(输入值 - >保留最终值) - :
123 -> 120
1237 -> 1200
12347 -> 12000
123457 -> 120000
1234567 -> 1200000
12345678 -> 12000000
FLOAT& amp;号。
注意:此列上没有对Trigger进行修改
答案 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。