2

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

create table test_tbl
(
  amt    number(20)
)

insert into test_tbl values (9.999)

上面插入的值是 10 而不是 9.999。我怎样才能完全保存 9.999?

谢谢

4

3 回答 3

7

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

如何修复它取决于您的需求。通常一个NUMBER列应该简单地声明为NUMBER。仅在有充分理由时才指定精度和比例。

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

您可以更改声明为的列NUMBER(20)NUMBER如果满足您的需要),因为在此更改中不会丢失信息。但是请注意,已经保存在列中的数字有 ALREADY LOST 信息,无法从表中恢复;如果您需要修复它,您将需要转到这些数字的原始来源。

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

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
于 2018-08-30T23:19:43.210 回答
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

结果

|        AMT |
|------------|
| 9.99948489 |
于 2018-08-30T23:14:08.087 回答
1

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

于 2019-06-17T05:57:24.967 回答