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

Преобразование в FLOAT/DOUBLE

Из типа string​

Изменение поведения

Начиная с версии 4.0 при переполнении результатом становится +/-Infinity вместо NULL.

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

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

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

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

<float>       ::= <whitespace>* <value> <whitespace>*

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

<value> ::= <decimal> | <infinity> | <nan>

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

<infinity> ::= <sign>? <inf_literal>

<nan> ::= <sign>? <nan_literal>

<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"

<inf_literal> ::= <"INF" case-insensitive> | <"INFINITY" case-insensitive>

<nan_literal> ::= <"NAN" case-insensitive>

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

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

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

  • Перед числами может стоять знак плюса или минуса;

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

  • Поддерживаются Infinity и NaN;

  • Для других форматов возвращается ошибка;

  • При переполнении значение преобразуется в +|-Infinity.

Примеры​

Строкаfloat/doubleКомментарий
"123.456"123.456
"123456."123456
"123456"123456
".123456"0.123456
" \t\r\n\f\v123.456 \t\r\n\f\v"123.456С пробельными символами в начале и в конце
" \t\r\n\f\v+123.456 \t\r\n\f\v"123.456С пробельными символами в начале и в конце, со знаком плюса
" \t\r\n\f\v-123.456 \t\r\n\f\v"-123.456С пробельными символами в начале и в конце, со знаком минуса
" \t\r\n\f\v+1.234e5 \t\r\n\f\v"123400Экспоненциальная запись
" \t\r\n\f\v+1.234e+5 \t\r\n\f\v"123400Экспоненциальная запись с положительным показателем степени
" \t\r\n\f\v+1.23456e-1 \t\r\n\f\v"0.123456Экспоненциальная запись с отрицательным показателем степени
"Infinity"Infinity
"NaN"NaN
"123.456a"ErrorНедопустимый формат
"1.7e409"InfinityПереполнение
"-1.7e409"-InfinityПереполнение

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

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

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

<float>       ::= <whitespace>* <value> <whitespace>*

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

<value> ::= <decimal> | <infinity> | <nan>

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

<infinity> ::= <sign>? <inf_literal>

<nan> ::= <sign>? <nan_literal>

<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"

<inf_literal> ::= <"INF" case-insensitive> | <"INFINITY" case-insensitive>

<nan_literal> ::= <"NAN" case-insensitive>

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

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

  • Значение в недопустимом формате преобразуется в NULL;

  • При переполнении значение преобразуется в +|-Infinity.

Примеры​

Строкаfloat/doubleКомментарий
"123.456"123.456
"12345."12345
".123456"0.123456
" \t\r\n\f\v123.456 \t\r\n\f\v"123.456С пробельными символами в начале и в конце
" \t\r\n\f\v+123.456 \t\r\n\f\v"123.456С пробельными символами в начале и в конце, со знаком плюса
" \t\r\n\f\v-123.456 \t\r\n\f\v"-123.456С пробельными символами в начале и в конце, со знаком минуса
" \t\r\n\f\v+1.234e5 \t\r\n\f\v"123400Экспоненциальная запись
"Infinity"Infinity
"NaN"NaN
"123.456a"NULLНедопустимый формат
"1.7e409"InfinityПереполнение
"-1.7e409"-InfinityПереполнение

Из типа bool​

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

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

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

Из типа integer​

Соответствует семантике статического приведения типов в C++. Возможна потеря точности.

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

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

Из float в double​

Соответствует семантике статического приведения типов в C++.

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

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

Из double в float​

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

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

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

  • Соответствует семантике статического приведения типов в C++.

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

Примеры​

doublefloatКомментарий
1.79769e+308InfinityПереполнение
-1.79769e+308-InfinityПереполнение

Из decimal в float​

Преобразование типа Decimal в float может привести к потере точности.

Тип Decimal(p, s) в Doris фактически хранится в памяти в виде целого числа, значение которого равно Decimal actual value * 10^s. Например, для типа Decimal(10, 6) значение 1234.56789 хранится в памяти как целое число 1234567890.

При преобразовании типа Decimal в float или double Doris фактически выполняет следующую операцию: static_cast<float>(integer value in memory) / (10^scale).

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

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

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

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

Примеры​

Decimal(76, 6)floatКомментарий
123456789.012345123456790Преобразование в float приводит к потере точности
9999999999999999999999999999999999999999999999999999999999999999999999.123456InfinityПереполнение

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

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

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

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

Примеры​

Decimal(76, 6)floatКомментарий
123456789.012345123456790Преобразование в float приводит к потере точности
9999999999999999999999999999999999999999999999999999999999999999999999.123456InfinityПереполнение

Из decimal в double​

В настоящее время тип Decimal поддерживает не более 76 значащих цифр. При преобразовании в double переполнение не возникает, возможна только потеря точности.

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

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

Примеры​

Decimal(76, 6)doubleКомментарий
123456789.012345123456789.01234515 значащих цифр, преобразование в double не приводит к потере точности
12345678901.01234512345678901.01234417 значащих цифр, преобразование в double приводит к потере точности
9999999999999999999999999999999999999999999999999999999999999999999999.1234561e+70Произойдёт потеря точности

Из date в float​

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

Возвращается ошибка.

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

Год, месяц и день даты последовательно объединяются в целое число. Месяц и день записываются двумя цифрами с добавлением 0 слева, если значение меньше 10. Затем это целое число преобразуется в float с помощью static_cast, что может привести к потере точности.

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

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

Примеры​

datefloatКомментарий
2025-04-2120250420Потеря точности

Из date в double​

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

Возвращается ошибка.

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

Год, месяц и день даты последовательно объединяются в целое число. Месяц и день записываются двумя цифрами с добавлением 0 слева, если значение меньше 10. Затем это целое число преобразуется в double с помощью static_cast.

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

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

Примеры​

datedoubleКомментарий
2025-04-21202504218 значащих цифр, без потери точности

Из datetime в float​

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

Возвращается ошибка.

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

Микросекундная часть datetime отбрасывается, затем год, месяц, день, час, минута и секунда последовательно объединяются в целое число. Месяц, день, час, минута и секунда записываются двумя цифрами с добавлением 0 слева, если значение меньше 10. Затем это целое число преобразуется в float с помощью static_cast, что может привести к потере точности.

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

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

Примеры​

datetimefloatКомментарий
2025-03-14 17:00:01.12345620250314170001Потеря точности
9999-12-31 23:59:59.99999999991231235959Потеря точности

Из datetime в double​

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

Возвращается ошибка.

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

Микросекундная часть datetime отбрасывается, затем год, месяц, день, час, минута и секунда последовательно объединяются в целое число. Месяц, день, час, минута и секунда записываются двумя цифрами с добавлением 0 слева, если значение меньше 10. Затем это целое число преобразуется в double с помощью static_cast.

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

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

Примеры​

datetimedoubleКомментарий
2025-03-14 17:00:01.1234562025031417000114 значащих цифр, без потери точности
9999-12-31 23:59:59.99999999991231235959

Из типа time​

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

Возвращается ошибка.

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

Преобразуется в число типа float/double, выраженное в микросекундах.

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

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

Примеры​

TimefloatКомментарий
00:00:011000000
838:59:583020398000000
838:59:58.1234563020398123456

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

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