Числовой столбец в таблице Oracle, в которой хранятся «скрытые» десятичные знаки - PullRequest
1 голос
/ 12 марта 2020

Первый вопрос здесь, потому что поиск этих терминов слишком расплывчатый. Я не знаю, как данные попали в таблицу (я думаю, просто «вставить в tomtest (test) values ​​(280.1);», но не уверен), но этот пример кажется странным. Почему прямой выбор показывает 1 десятичный знак, а выбор to_char показывает 14 десятичных знаков?

SQL> set linesize 100
SQL> select banner from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
PL/SQL Release 12.2.0.1.0 - Production
CORE    12.2.0.1.0      Production
TNS for Linux: Version 12.2.0.1.0 - Production
NLSRTL Version 12.2.0.1.0 - Production

SQL> describe tomtest
 Name                                                  Null?    Type
 ----------------------------------------------------- -------- ------------------------------------
 TEST                                                           NUMBER

SQL> select * from tomtest;

      TEST
----------
     280.1

SQL> select * from tomtest where test = 280.1;

no rows selected

SQL> select to_char(test) from tomtest;

TO_CHAR(TEST)
----------------------------------------
280.10000000000002

SQL> SELECT data_type, data_length, data_precision, data_scale FROM USER_TAB_COLS WHERE TABLE_NAME = 'TOMTEST' AND COLUMN_NAME = 'TEST';

DATA_TYPE DATA_LENGTH DATA_PRECISION DATA_SCALE
NUMBER          22

1 Ответ

0 голосов
/ 12 марта 2020

Причина - числовой формат по умолчанию в sql plus. в базе данных у вас есть значение 280.10000000000002, а не 280.1

вот пример

SQL> select 128.000000000000000000006 as test from dual;

test
-------------------------
                      128

SQL> select 128.200000000000000000006 as test from dual;

test
-------------------------
                    128,2

вы можете изменить формат номера и проверить еще раз

SQL> SET NUMF 999999999.99999999999999999999999999999999
SQL> select 128.200000000000000000006 as test from dual;

test
-------------------------------------------
       128.20000000000000000000600000000000

SQL>

Обновление: Это явление можно объяснить тем фактом, что ваш тип данных определяется только как число, без точного указания точности. Это означает, что вы можете сохранить десятичное число, но не дать точную спецификацию десятичных разрядов.

Вот пример, который показывает различия.

CREATE TABLE test_num(
n1 NUMBER,
n2 NUMBER(23,15));

INSERT INTO test_num VALUES(208.20000000000006,208.20000000000006);

SELECT t.*FROM test_num t;

Resut в PLSQL / Разработчик:

N      N2
---    ---
208,2  208,200000000000030

в pl sql Разработчик вы можете отображать числа в виде символов. Если вы хотите, чтобы активировать флажок в настройках: Tools -> Preferences -> SQL Window -> Number fields to_char

в вашем случае, я бы округлил числовое значение до определенного количества десятичных знаков при вставке / обновлении или изменил бы ваш тип данных с number до number(p, s) (где p - точность, а s - масштаб.)

...