メインコンテンツまでスキップ
に最終更新

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 に変換します。

例​

doublefloat説明
1.79769e+308Infinityオーバーフロー
-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.012345123456790float への変換で精度が失われます
9999999999999999999999999999999999999999999999999999999999999999999999.123456Infinityオーバーフロー

非厳格モード​

オーバーフロー時は Infinity に変換します。

変換元の型が NULL 許容の場合、戻り値も NULL 許容型になります。

変換元の型が NULL 非許容の場合、戻り値も NULL 非許容型になります。

例​

Decimal(76, 6)float説明
123456789.012345123456790float への変換で精度が失われます
9999999999999999999999999999999999999999999999999999999999999999999999.123456Infinityオーバーフロー

decimal から double への変換​

現在、Decimal 型の有効桁数は最大 76 桁です。double 型への変換ではオーバーフローは発生せず、精度が失われる場合のみあります。

変換元の型が NULL 許容の場合、戻り値も NULL 許容型になります。

変換元の型が NULL 非許容の場合、戻り値も NULL 非許容型になります。

例​

Decimal(76, 6)double説明
123456789.012345123456789.012345有効桁数は 15 桁で、double への変換では精度は失われません
12345678901.01234512345678901.012344有効桁数は 17 桁で、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-2120250421有効桁数は 8 桁で、精度は失われません

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.12345620250314170001有効桁数は 14 桁で、精度は失われません
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 は、TIMESTAMP_NS の範囲内にある 14 桁の結果をすべて正確に表現できます。

変換元の型が NULL 許容の場合、戻り値の型も NULL 許容です。

変換元の型が NULL 非許容の場合、戻り値の型も NULL 非許容です。

例​

TIMESTAMP_NSdouble説明
2024-02-29 12:34:56.12345678920240229123456精度は失われません
2262-04-11 23:47:16.85477580722620411234716小数秒部分が切り捨てられます

その他の型からの変換​

サポートされていません。