Преобразование в 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.
Примеры
| 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. Затем это целое число преобразуется в float с помощью static_cast, что может привести к потере точности.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Примеры
| date | float | Комментарий |
|---|---|---|
| 2025-04-21 | 20250420 | Потеря точности |
Из date в double
Строгий режим
Возвращается ошибка.
Нестрогий режим
Год, месяц и день даты последовательно объединяются в целое число. Месяц и день записываются двумя цифрами с добавлением 0 слева, если значение меньше 10. Затем это целое число преобразуется в double с помощью static_cast.
Если исходный тип допускает NULL, возвращается тип, допускающий NULL.
Если исходный тип не допускает NULL, возвращается тип, не допускающий NULL.
Примеры
| date | double | Комментарий |
|---|---|---|
| 2025-04-21 | 20250421 | 8 значащих цифр, без потери точности |
Из datetime в float
Строгий режим
Возвращается ошибка.
Нестрогий режим
Микросекундная часть datetime отбрасывается, затем год, месяц, день, час, минута и секунда последовательно объединяются в целое число. Месяц, день, час, минута и секунда записываются двумя цифрами с добавлением 0 слева, если значение меньше 10. Затем это целое число преобразуется в float с помощью static_cast, что может привести к потере точности.
Если исходный тип допускает 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. Затем это целое число преобразуется в double с помощью static_cast.
Если исходный тип допускает 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 |
Из других типов
Не поддерживается.