Перейти к содержимому
Последнее обновление

Преобразование в тип DECIMAL

Из типа string​

Строгий режим​

Если исходный тип допускает NULL, возвращается тип, допускающий NULL;

Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL;

Определение BNF​

<decimal>     ::= <whitespace>* <value> <whitespace>*

<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"

<value> ::= <sign>? <significand> <exponent>?

<sign> ::= "+" | "-"

<significand> ::= <digits> "." <digits> | <digits> | <digits> "." | "." <digits>

<digits> ::= <digit>+

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<exponent> ::= <e_marker> <sign>? <digits>

<e_marker> ::= "e" | "E"

Описание правил​

  • Поддерживаются только десятичные цифры;

  • Поддерживается экспоненциальная запись;

  • Поддерживается округление;

  • В начале и в конце строк допускаются произвольные пробельные символы, в том числе: " ", "\t", "\n", "\r", "\f", "\v".

  • При переполнении целой части возвращается ошибка;

  • При некорректном формате возвращается ошибка.

Примеры​

СтрокаDecimal(18, 6)Комментарий
"123.1234567"123.123457Округление
"12345."12345.000000
"12345"12345.000000
".123456"0.123456
" \t\r\n\f\v123.456 \t\r\n\f\v"123.456000С пробельными символами в начале и в конце
" \t\r\n\f\v+123.456 \t\r\n\f\v"123.456000С пробельными символами в начале и в конце, со знаком плюс
" \t\r\n\f\v-123.456 \t\r\n\f\v"-123.456000С пробельными символами в начале и в конце, со знаком минус
" \t\r\n\f\v+1.234e5 \t\r\n\f\v"123400.000000Экспоненциальная запись
" \t\r\n\f\v+1.234e+5 \t\r\n\f\v"123400.000000Экспоненциальная запись с положительным показателем степени
" \t\r\n\f\v+1.234e-1 \t\r\n\f\v"0.123400Экспоненциальная запись с отрицательным показателем степени
"123.456a"ОшибкаНекорректный формат
"1234567890123.123456"ОшибкаПереполнение

Нестрогий режим​

Всегда возвращается тип, допускающий NULL;

Определение BNF​

<decimal>     ::= <whitespace>* <value> <whitespace>*

<whitespace> ::= " " | "\t" | "\n" | "\r" | "\f" | "\v"

<value> ::= <sign>? <significand> <exponent>

<sign> ::= "+" | "-"

<significand> ::= <digits> | <digits> "." <digits> | <digits> "." | "." <digits>

<digits> ::= <digit>+

<digit> ::= "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"

<exponent> ::= <e_marker> <sign>? <digits>

<e_marker> ::= "e" | "E"

Описание правил​

  • Поддерживаются все допустимые форматы строгого режима;

  • При переполнении выполняется преобразование в NULL;

  • При некорректном формате выполняется преобразование в NULL.

Примеры​

СтрокаDecimal(18, 6)Комментарий
"123.1234567"123.123457Округление
"12345."12345.000000
"12345"12345.000000
".123456"0.123456
" \t\r\n\f\v123.456 \t\r\n\f\v"123.456000С пробельными символами в начале и в конце
" \t\r\n\f\v+123.456 \t\r\n\f\v"123.456000С пробельными символами в начале и в конце, со знаком плюс
" \t\r\n\f\v-123.456 \t\r\n\f\v"-123.456000С пробельными символами в начале и в конце, со знаком минус
" \t\r\n\f\v+1.234e5 \t\r\n\f\v"123400.000000Экспоненциальная запись
" \t\r\n\f\v+1.234e+5 \t\r\n\f\v"123400.000000Экспоненциальная запись с положительным показателем степени
" \t\r\n\f\v+1.234e-1 \t\r\n\f\v"0.123400Экспоненциальная запись с отрицательным показателем степени
"123.456a"NULLНекорректный формат
"1234567890123.123456"NULLПереполнение

Из типа bool​

true преобразуется в 1, false преобразуется в 0.

Строгий режим​

При переполнении возникает ошибка (например, cast bool as decimal(1, 1)).

Если исходный тип допускает NULL, возвращается тип, допускающий NULL.

Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.

Нестрогий режим​

При переполнении выполняется преобразование в NULL.

Если исходный тип допускает NULL, возвращается тип, допускающий NULL.

Если исходный тип не допускает NULL:

  • Если возможно переполнение (например, cast bool as decimal(1, 1)), возвращается тип, допускающий NULL;

  • В остальных случаях возвращается тип, не допускающий NULL.

Из целочисленного типа​

Строгий режим​

При переполнении возникает ошибка.

Если исходный тип допускает NULL, возвращается тип, допускающий NULL.

Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.

Примеры​

intDecimal(18, 9)Комментарий
123123.00000000
2147483647ОшибкаПереполнение

Нестрогий режим​

При переполнении выполняется преобразование в NULL.

Если исходный тип допускает NULL, возвращается тип, допускающий NULL.

Если исходный тип не допускает NULL:

  • Если возможно переполнение (например, cast int as decimal(1, 0)), возвращается тип, допускающий NULL;

  • В остальных случаях возвращается тип, не допускающий NULL (например, cast int as decimal(18, 0)).

Примеры​

intDecimal(18, 9)Комментарий
123123.00000000
2147483647NULLПереполнение

Из типов float/double​

Поддерживается округление.

Строгий режим​

Если исходный тип допускает NULL, возвращается тип, допускающий NULL.

Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.

  • Infinity и NaN приводят к ошибкам.

  • При переполнении возникает ошибка.

Примеры​

float/doubleDecimal(18, 3)Комментарий
1.12391.124Округление
3.40282e+38ОшибкаПереполнение
InfinityОшибка
NaNОшибка

Нестрогий режим​

Всегда возвращается тип, допускающий NULL.

  • +/-Inf преобразуется в NULL;

  • NaN преобразуется в NULL;

  • При переполнении выполняется преобразование в NULL.

Примеры​

float/doubleDecimal(18, 6)Комментарий
1.1234561.123456
3.40282e+38NULLПереполнение
InfinityNULL
NaNNULL

Преобразование между типами DECIMAL​

Поддерживается округление.

Строгий режим​

При переполнении возникает ошибка.

Если исходный тип допускает NULL, возвращается тип, допускающий NULL.

Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.

Примеры​

Decimal(18, 8)Decimal(10, 6)Комментарий
1234.123456781234.123457Округление
12345.12345678ОшибкаПереполнение целой части

Нестрогий режим​

При переполнении выполняется преобразование в NULL.

Если исходный тип допускает NULL, возвращается тип, допускающий NULL.

Если исходный тип не допускает NULL:

  • Если возможно переполнение (например, cast decimal(18, 0) as decimal(9, 0)), возвращается тип, допускающий NULL;

  • В остальных случаях возвращается тип, не допускающий NULL (например, cast decimal(9, 0) as decimal(18, 0)).

Примеры​

Decimal(18, 8)Decimal(10, 6)Комментарий
1234.123456781234.123457Округление
12345.12345678NULLПереполнение целой части

Из типа date​

Не поддерживается.

Из типа datetime​

Не поддерживается.

Из типа TIMESTAMP_NS​

Не поддерживается.

Из типа time​

Не поддерживается.

Из других типов​

Не поддерживается