我有一张表,其中一列的数据类型为 number(20)。在一种情况下,我需要将十进制值保存到该列中,但是该列会自动将其转换为整数。下面是我为测试这种情况而创建的简单测试表。
create table test_tbl
(
amt number(20)
)
insert into test_tbl values (9.999)
上面插入的值为10而不是9.999。如何完全保存9.999?
谢谢
答案 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_FLOAT
,BINARY_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。这应该可以解决您的问题。