FLOAT/DOUBLE への変換
文字列からの変換
バージョン 4.0 以降、オーバーフロー時の結果は NULL ではなく +/-Infinity になります。
厳格モード
変換元の型が 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 非許容型になります。
整数からの変換
C++ の static cast の動作に従います。精度が失われる場合があります。
変換元の型が NULL 許容の場合、戻り値も NULL 許容型になります。
変換元の型が NULL 非許容の場合、戻り値も NULL 非許容型になります。
float から double への変換
C++ の static cast の動作に従います。
変換元の型が NULL 許容の場合、戻り値も NULL 許容型になります。
変換元の型が NULL 非許容の場合、戻り値も NULL 非許容型になります。
double から float への変換
変換元の型が NULL 許容の場合、戻り値も NULL 許容型になります。
変換元の型が NULL 非許容の場合、戻り値も NULL 非許容型になります。
変換規則
-
C++ の static cast の動作に従います。
-
オーバーフロー時は +-Infinity に変換します。
例
| double | float | 説明 |
|---|---|---|
| 1.79769e+308 | Infinity | オーバーフロー |
| -1.79769e+308 | -Infinity | オーバーフロー |
decimal から float への変換
Decimal 型から float への変換では、精度が失われる場合があります。
Doris の Decimal(p, s) 型は、実際にはメモリ内で整数として表現され、その整数値は 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 は、TIMESTAMP_NS の範囲内にある 14 桁の結果をすべて正確に表現できます。
変換元の型が NULL 許容の場合、戻り値の型も NULL 許容です。
変換元の型が NULL 非許容の場合、戻り値の型も NULL 非許容です。
例
| TIMESTAMP_NS | double | 説明 |
|---|---|---|
2024-02-29 12:34:56.123456789 | 20240229123456 | 精度は失われません |
2262-04-11 23:47:16.854775807 | 22620411234716 | 小数秒部分が切り捨てられます |
その他の型からの変換
サポートされていません。