【问题标题】:Oracle Save decimal in a column with number datatypeOracle 在具有数字数据类型的列中保存小数
【发布时间】:2018-08-30 23:09:05
【问题描述】:

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

create table test_tbl
(
  amt    number(20)
)

insert into test_tbl values (9.999)

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

谢谢

【问题讨论】:

    标签: oracle oracle12c


    【解决方案1】:

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

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

    例如:如果您的数字必须限制在小数点前不超过 20 位且小数点后不超过 6 位(小数点后),则总精度为 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
    

    【讨论】:

    • 这对我有帮助..也许我可以建议将 number(20) 更改为没有任何精度的数字。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以尝试使用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 |
      

      【讨论】:

      • 我创建的表是一个测试表。如果无法更改数据类型怎么办?
      • @DG3 - 如果更改数据类型不是一个选项,那么您不能在该列中保存非整数,句点。但是,您实际上并不需要更改数据类型,您只需要更改精度和比例即可。
      • 如果您无法更改软管的类型。无法存储数字的小数部分。我想你可以将它乘以足够大的 10 次方,得到一个整数。
      猜你喜欢
      • 2011-06-05
      • 2015-06-12
      • 1970-01-01
      • 2012-03-07
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      相关资源
      最近更新 更多