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 または -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 または -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 | オーバーフロー |
真偽値からの変換
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 または -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 への変換
厳格モード
エラーを返します。
非厳格モード
日付の年、月、日をこの順に連結して整数を作ります。月と日は二桁で扱い、10 未満の場合は先頭に 0 を補います。その整数を static_cast で float に変換するため、精度が失われる場合があります。
変換元の型が NULL を許容する場合、戻り値の型も NULL を許容します。
変換元の型が NULL を許容しない場合、戻り値の型も NULL を許容しません。
例
| date | float | 説明 |
|---|---|---|
| 2025-04-21 | 20250420 | 精度の損失 |
date から double への変換
厳格モード
エラーを返します。
非厳格モード
日付の年、月、日をこの順に連結して整数を作ります。月と日は二桁で扱い、10 未満の場合は先頭に 0 を補います。その整数を static_cast で double に変換します。
変換元の型が NULL を許容する場合、戻り値の型も NULL を許容します。
変換元の型が NULL を許容しない場合、戻り値の型も NULL を許容しません。
例
| date | double | 説明 |
|---|---|---|
| 2025-04-21 | 20250421 | 有効桁数は 8 桁で、精度は失われません |
datetime から float への変換
厳格モード
エラーを返します。
非厳格モード
datetime のマイクロ秒部分を切り捨て、年、月、日、時、分、秒をこの順に連結して整数を作ります。月、日、時、分、秒は二桁で扱い、10 未満の場合は先頭に 0 を補います。その整数を 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 のマイクロ秒部分を切り捨て、年、月、日、時、分、秒をこの順に連結して整数を作ります。月、日、時、分、秒は二桁で扱い、10 未満の場合は先頭に 0 を補います。その整数を 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 |
その他の型からの変換
サポートされていません。