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

Приведение к типу 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"ErrorНедопустимый формат
"1234567890123.123456"ErrorПереполнение

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

Всегда возвращается тип, допускающий 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
2147483647ErrorПереполнение

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

При переполнении значение преобразуется в 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+38ErrorПереполнение
InfinityError
NaNError

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

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

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

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

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

Примеры​

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

Приведение между десятичными типами​

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

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

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

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

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

Примеры​

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

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

При переполнении значение преобразуется в 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​

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

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

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

Преобразование из других типов​

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