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

Преобразование в 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​

Применяется семантика static cast в C++. Возможна потеря точности.

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

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

Из float в double​

Применяется семантика static cast в C++.

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

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

Из double в float​

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

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

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

  • Применяется семантика static cast в 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. Затем с помощью static_cast это целое число преобразуется в float, что может привести к потере точности.

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

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

Примеры​

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

Из date в double​

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

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

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

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

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

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

Примеры​

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

Из datetime в float​

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

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

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

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

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

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

Примеры​

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

Из datetime в double​

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

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

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

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

Если исходный тип допускает 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

Из TIMESTAMP_NS в float​

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

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

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

Doris отбрасывает девятизначную дробную часть секунды без округления, объединяет год, месяц, день, час, минуту и секунду в целое число формата YYYYMMDDHHMMSS, а затем с помощью static_cast преобразует это целое число в FLOAT. Поскольку FLOAT имеет меньше значащих цифр, чем 14-значное целое число, это преобразование обычно приводит к потере точности.

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

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

Примеры​

TIMESTAMP_NSfloatКомментарий
2024-02-29 12:34:56.1234567892.02402284E13Дробная часть отбрасывается, а при преобразовании 14-значного целого числа теряется точность

Из TIMESTAMP_NS в double​

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

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

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

Doris отбрасывает девятизначную дробную часть секунды без округления, объединяет год, месяц, день, час, минуту и секунду в целое число формата YYYYMMDDHHMMSS, а затем с помощью static_cast преобразует это целое число в DOUBLE. Тип DOUBLE позволяет точно представить любой 14-значный результат в диапазоне TIMESTAMP_NS.

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

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

Примеры​

TIMESTAMP_NSdoubleКомментарий
2024-02-29 12:34:56.12345678920240229123456Без потери точности
2262-04-11 23:47:16.85477580722620411234716Дробная часть отбрасывается

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

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