Oracle将十进制数保存在具有数字数据类型的列中

时间:2018-08-30 23:09:05

标签: oracle oracle12c

我有一张表,其中一列的数据类型为 number(20)。在一种情况下,我需要将十进制值保存到该列中,但是该列会自动将其转换为整数。下面是我为测试这种情况而创建的简单测试表。

create table test_tbl
(
  amt    number(20)
)

insert into test_tbl values (9.999)

上面插入的值为10而不是9.999。如何完全保存9.999?

谢谢

3 个答案:

答案 0 :(得分:4)

在Oracle中,您可以(但不是必须)为NUMBER(20)数据类型的列提供精度和小数位数。 NUMBER(20,0)NUMBER的有效简写,表示20位数字,小数点后

如何修复它取决于您的需求。通常,NUMBER列应简单地声明为NUMBER(26, 6)。仅在有充分理由的情况下指定精度和比例。

例如:如果您的数字必须限制在小数点前不超过20位且小数点后不超过6位(小数点后),则总的PRECISION为20 + 6 = 26。 NUMBER(20)

您可以将声明为NUMBER的列更改为create table test_tbl ( amt number(20) ); insert into test_tbl values (9.999); select * from test_tbl; AMT --- 10 alter table test_tbl modify (amt number); insert into test_tbl values (9.999); select * from test_tbl; AMT ----- 10 9.999 (如果满足您的其他需求),因为此更改不会丢失任何信息。但是,请注意,已保存在该列中的数字具有“已丢失”信息,无法从表中恢复该信息。如果需要解决这些问题,则需要转到这些数字的原始来源。

简短演示(请注意,在最后一个输出中,在更改之前,该行插入的值将永远更改为10,无法恢复):

{{1}}

答案 1 :(得分:1)

您可以尝试使用NUMBER(20,18)BINARY_FLOATBINARY_DOUBLE会更多

  

NUMBER [(p [,s])]精度为p,小数位数为s的数字。   p的范围:1到38。   s的范围:-84至127。   精度和小数位都用十进制数字表示。

create table test_tbl
(
   amt NUMBER(20,18)
);

insert into test_tbl values (9.99948489);

查询1

SELECT * FROM test_tbl

Results

|        AMT |
|------------|
| 9.99948489 |

答案 2 :(得分:0)

除非非常确定字段的精度,否则始终将AMOUNT和NUMERIC字段创建为NUMBER数据类型,而不使用Scale和Precision。这应该可以解决您的问题。