Преобразование в 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.
Примеры
| double | float | Комментарий |
|---|---|---|
| 1.79769e+308 | Infinity | Переполнение |
| -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.012345 | 123456790 | Приведение к float приводит к потере точности |
| 9999999999999999999999999999999999999999999999999999999999999999999999.123456 | Infinity | Переполнение |
Нестрогий режим
При переполнении значение преобразуется в Infinity.
Если исходный тип допускает NULL, возвращаемый тип также допускает NULL.
Если исходный тип не допускает NULL, возвращаемый тип также не допускает NULL.
Примеры
| Decimal(76, 6) | float | Комментарий |
|---|---|---|
| 123456789.012345 | 123456790 | Приведение к float приводит к потере точности |
| 9999999999999999999999999999999999999999999999999999999999999999999999.123456 | Infinity | Переполнение |
Из decimal в double
В настоящее время тип Decimal может содержать не более 76 значащих цифр. При приведении к типу double переполнение не возникает, возможна только потеря точности.
Если исходный тип допускает NULL, возвращаемый тип также допускает NULL.
Если исходный тип не допускает NULL, возвращаемый тип также не допускает NULL.
Примеры
| Decimal(76, 6) | double | Комментарий |
|---|---|---|
| 123456789.012345 | 123456789.012345 | 15 значащих цифр, приведение к double не приводит к потере точности |
| 12345678901.012345 | 12345678901.012344 | 17 значащих цифр, приведение к double приводит к потере точности |
| 9999999999999999999999999999999999999999999999999999999999999999999999.123456 | 1e+70 | Произойдёт потеря точности |
Из date в float
Строгий режим
Возвращается ошибка.
Нестрогий режим
Числовые значения года, месяца и дня даты последовательно объединяются в целое число. Месяц и день записываются двумя цифрами с ведущим 0, если значение меньше 10. Затем с помощью static_cast это целое число преобразуется в float, что может привести к потере точности.
Если исходный тип допускает NULL, возвращаемый тип также допускает NULL.
Если исходный тип не допускает NULL, возвращаемый тип также не допускает NULL.
Примеры
| date | float | Комментарий |
|---|---|---|
| 2025-04-21 | 20250420 | Потеря точности |
Из date в double
Строгий режим
Возвращается ошибка.
Нестрогий режим
Числовые значения года, месяца и дня даты последовательно объединяются в целое число. Месяц и день записываются двумя цифрами с ведущим 0, если значение меньше 10. Затем с помощью static_cast это целое число преобразуется в double.
Если исходный тип допускает NULL, возвращаемый тип также допускает NULL.
Если исходный тип не допускает NULL, возвращаемый тип также не допускает NULL.
Примеры
| date | double | Комментарий |
|---|---|---|
| 2025-04-21 | 20250421 | 8 значащих цифр, без потери точности |
Из datetime в float
Строгий режим
Возвращается ошибка.
Нестрогий режим
Микросекундная часть datetime отбрасывается, затем год, месяц, день, час, минута и секунда последовательно объединяются в целое число. Месяц, день, час, минута и секунда записываются двумя цифрами с ведущим 0, если значение меньше 10. Затем с помощью static_cast это целое число преобразуется в float, что может привести к потере точности.
Если исходный тип допускает NULL, возвращаемый тип также допускает NULL.
Если исходный тип не допускает NULL, возвращаемый тип также не допускает NULL.
Примеры
| datetime | float | Комментарий |
|---|---|---|
| 2025-03-14 17:00:01.123456 | 20250314170001 | Потеря точности |
| 9999-12-31 23:59:59.999999 | 99991231235959 | Потеря точности |
Из datetime в double
Строгий режим
Возвращается ошибка.
Нестрогий режим
Микросекундная часть datetime отбрасывается, затем год, месяц, день, час, минута и секунда последовательно объединяются в целое число. Месяц, день, час, минута и секунда записываются двумя цифрами с ведущим 0, если значение меньше 10. Затем с помощью static_cast это целое число преобразуется в double.
Если исходный тип допускает NULL, возвращаемый тип также допускает NULL.
Если исходный тип не допускает NULL, возвращаемый тип также не допускает NULL.
Примеры
| datetime | double | Комментарий |
|---|---|---|
| 2025-03-14 17:00:01.123456 | 20250314170001 | 14 значащих цифр, без потери точности |
| 9999-12-31 23:59:59.999999 | 99991231235959 |
Из time
Строгий режим
Возвращается ошибка.
Нестрогий режим
Преобразуется в число типа float/double, выраженное в микросекундах.
Если исходный тип допускает NULL, возвращаемый тип также допускает NULL.
Если исходный тип не допускает NULL, возвращаемый тип также не допускает NULL.
Примеры
| Time | float | Комментарий |
|---|---|---|
| 00:00:01 | 1000000 | |
| 838:59:58 | 3020398000000 | |
| 838:59:58.123456 | 3020398123456 |
Из TIMESTAMP_NS в float
Строгий режим
Возвращается ошибка.
Нестрогий режим
Doris отбрасывает девятизначную дробную часть секунды без округления, объединяет год, месяц, день, час, минуту и секунду в целое число формата YYYYMMDDHHMMSS, а затем с помощью static_cast преобразует это целое число в FLOAT. Поскольку FLOAT имеет меньше значащих цифр, чем 14-значное целое число, это преобразование обычно приводит к потере точности.
Если исходный тип допускает NULL, возвращаемый тип также допускает NULL.
Если исходный тип не допускает NULL, возвращаемый тип также не допускает NULL.
Примеры
| TIMESTAMP_NS | float | Комментарий |
|---|---|---|
2024-02-29 12:34:56.123456789 | 2.02402284E13 | Дробная часть отбрасывается, а при преобразовании 14-значного целого числа теряется точность |
Из TIMESTAMP_NS в double
Строгий режим
Возвращается ошибка.
Нестрогий режим
Doris отбрасывает девятизначную дробную часть секунды без округления, объединяет год, месяц, день, час, минуту и секунду в целое число формата YYYYMMDDHHMMSS, а затем с помощью static_cast преобразует это целое число в DOUBLE. Тип DOUBLE позволяет точно представить любой 14-значный результат в диапазоне TIMESTAMP_NS.
Если исходный тип допускает NULL, возвращаемый тип также допускает NULL.
Если исходный тип не допускает NULL, возвращаемый тип также не допускает NULL.
Примеры
| TIMESTAMP_NS | double | Комментарий |
|---|---|---|
2024-02-29 12:34:56.123456789 | 20240229123456 | Без потери точности |
2262-04-11 23:47:16.854775807 | 22620411234716 | Дробная часть отбрасывается |
Из других типов
Не поддерживается.