【问题标题】:How to prevent rounding in Oracle database?如何防止在 Oracle 数据库中舍入?
【发布时间】:2022-12-09 22:41:50
【问题描述】:

我想防止 Oracle 数据库中的数字四舍五入 我想防止 Oracle 数据库中的数字四舍五入 我想防止 Oracle 数据库中的数字四舍五入 我想防止 Oracle 数据库中的数字四舍五入 价格 = 14.089 => 变成:14.09

在我的数据库中,列的类型是DECIMAL

我想在逗号后得到价格的 3 个数字。 谁能帮我解决这个问题

SELECT
    *
FROM
    user_tab_columns
WHERE
    table_name = 'GEST_SANTE.PRESTATION_PHARMACIE'
AND column_name = 'PRICE';

执行查询后的结果:

插入 ””。”” (

    "OWNER",
    "TABLE_NAME",
    "COLUMN_NAME",
    "DATA_TYPE",
    "DATA_TYPE_MOD",
    "DATA_TYPE_OWNER",
    "DATA_LENGTH",
    "DATA_PRECISION",
    "DATA_SCALE",
    "NULLABLE",
    "COLUMN_ID",
    "DEFAULT_LENGTH",
    "DATA_DEFAULT",
    "NUM_DISTINCT",
    "LOW_VALUE",
    "HIGH_VALUE",
    "DENSITY",
    "NUM_NULLS",
    "NUM_BUCKETS",
    "LAST_ANALYZED",
    "SAMPLE_SIZE",
    "CHARACTER_SET_NAME",
    "CHAR_COL_DECL_LENGTH",
    "GLOBAL_STATS",
    "USER_STATS",
    "AVG_COL_LEN",
    "CHAR_LENGTH",
    "CHAR_USED",
    "V80_FMT_IMAGE",
    "DATA_UPGRADED",
    "HISTOGRAM"
)
VALUES
    (
        'GEST_SANTE',
        'PRESTATION_PHARMACIE',
        'PRICE',
        'NUMBER',
        NULL,
        NULL,
        '22',
        NULL,
        '3',
        'Y',
        '23',
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        NULL,
        'NO',
        'NO',
        NULL,
        '0',
        NULL,
        'NO',
        'YES',
        'NONE'
    );

【问题讨论】:

  • 如果你使用DESCRIBE your_table_nameSELECT * FROM user_tab_columns WHERE table_name = 'YOUR_TABLE_NAME' and column_name = 'PRICE';,输出是什么?
  • @MT0 什么是 user_tab_columns ?
  • 数据字典中的一个视图,描述当前用户拥有的表的列。
  • @MT0 我测试了但是没有出现
  • 您是否将 YOUR_TABLE_NAME 替换为您的表名? (大写,除非您使用带引号的标识符)。

标签: sql oracle


【解决方案1】:

DECIMAL 只是NUMBER 的别名,如果你想要一个可以存储多个小数位的列,那么你需要为该列指定一个比例。

例如,如果你想要 5 个小数位,那么你可以使用:

CREATE TABLE your_table_name (
  price DECIMAL(*,5)
);

如果您只指定了 2 位小数:

CREATE TABLE your_table_name (
  price DECIMAL(*,2)
);

然后,是的,您输入的值将四舍五入到小数点后两位,因为该列无法存储更高的精度。

您可以使用以下方法更改列的比例:

ALTER TABLE your_table_name MODIFY (price DECIMAL(*,5));

但是,它不会更改列中已存储的数据;但它可以让您在以后插入更精确的值。

fiddle

【讨论】:

  • 我不想在逗号后添加超过 3 个数字!如果我的价格是 14.15454,那么它就是 14.15454! (那就是如果我要添加小数位
  • @darine 如果您将 14.15454 存储在至少有 5 位小数的列中,那么 Oracle 将存储该确切数字并将不是显示时将其舍入。如果您已将其存储在小于 5 位数字的列中,那么它不能将其存储为您提供的精度(因为您已告诉它不要这样做)并将四舍五入。您需要更好地解释舍入发生位置的问题。
  • 我存储了一个价格 14.0895,它在我的数据库中变成了 14.09!因为规模是 3
  • @darine 然后,正如我在回答中所说,使用 ALTER TABLE 语句更改列的比例。你不能在一列中存储的小数位数比您告诉数据库的该列允许的小数位数多(它只是按照编程的方式进行操作)。
猜你喜欢
  • 2013-04-18
  • 1970-01-01
  • 2010-10-16
  • 2016-12-09
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2020-06-06
  • 1970-01-01
相关资源
最近更新 更多