メインコンテンツまでスキップ
バージョン: 26.x

FLOAT/DOUBLEに変換する

文字列から

動作の変更

バージョン4.0以降、オーバーフローの結果はNULLではなく+/-Infinityになります。

Strict mode

ソースタイプがnullableの場合、nullable typeを返します;

ソースタイプがnon-nullableの場合、non-nullable typeを返します;

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>

ルールの説明

  • 10進形式の数値のみサポート;

  • 科学的記数法をサポート;

  • 数値には正または負の符号文字を前置可能;

  • 文字列では任意の前置および後置空白文字を許可、以下を含む: " ", "\t", "\n", "\r", "\f", "\v";

  • InfinityとNaNをサポート;

  • その他の形式はエラーを返す;

  • オーバーフローは+|-Infinityに変換される。

Stringfloat/doubleComment
"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オーバーフロー

非厳密モード

常にnullable型を返します。

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>

ルール説明

  • strict modeからのすべての有効な形式をサポート;

  • 無効な形式はNULLに変換;

  • オーバーフローは+|-Infinityに変換。

Stringfloat/doubleComment
"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に変換されます。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

integerから

C++のstatic castセマンティクスに従います。精度が失われる場合があります。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

floatからdoubleへ

C++のstatic castセマンティクスに従います。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

doubleからfloatへ

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

ルール説明

  • C++のstatic castセマンティクスに従います。

  • オーバーフローは+-Infinityに変換されます。

doublefloatComment
1.79769e+308Infinityオーバーフロー
-1.79769e+308-Infinityオーバーフロー

decimalからfloatへ

Decimal型をfloatにキャストすると精度が失われる場合があります。

DorisのDecimal(p, s)型は実際にはメモリ内で整数として表現され、その整数値はDecimal実際の値 * 10^sに等しくなります。例えば、Decimal(10, 6)値1234.56789は、メモリ内で整数値1234567890として表現されます。

Decimal型をfloat型やdouble型に変換する際、Dorisは実際には次の操作を実行します:static_cast(メモリ内の整数値) / (10^scale)。

Strict mode

オーバーフローの場合はInfinityに変換されます。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

Decimal(76, 6)floatComment
123456789.012345123456790floatへのキャストで精度が失われます
9999999999999999999999999999999999999999999999999999999999999999999999.123456Infinityオーバーフロー

Non-strict mode

オーバーフローの場合はInfinityに変換されます。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

Decimal(76, 6)floatComment
123456789.012345123456790floatへのキャストで精度が失われます
9999999999999999999999999999999999999999999999999999999999999999999999.123456Infinityオーバーフロー

decimalからdoubleへ

現在、Decimal型は最大76の有効桁数を持つことができます。double型へのキャストではオーバーフローの問題はなく、精度の損失の問題のみがあります。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

Decimal(76, 6)doubleComment
123456789.012345123456789.01234515有効桁数、doubleへのキャストで精度は失われません
12345678901.01234512345678901.01234417有効桁数、doubleへのキャストで精度が失われます
9999999999999999999999999999999999999999999999999999999999999999999999.1234561e+70精度が失われます

dateからfloatへ

Strict mode

エラーを返します。

Non-strict mode

日付の年、月、日の数字を順番に連結して整数を形成し、月と日は2桁として扱い、10未満の場合は先頭に0を付けます。その後、この整数をfloatにstatic_castしますが、精度が失われる場合があります。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

datefloatComment
2025-04-2120250420精度の損失

dateからdoubleへ

Strict mode

エラーを返します。

Non-strict mode

日付の年、月、日の数字を順番に連結して整数を形成し、月と日は2桁として扱い、10未満の場合は先頭に0を付けます。その後、この整数をdoubleにstatic_castします。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

datedoubleComment
2025-04-21202504218有効桁数、精度の損失はありません

datetimeからfloatへ

Strict mode

エラーを返します。

Non-strict mode

datetimeのマイクロ秒部分を破棄し、年、月、日、時、分、秒を順番に連結して整数を形成します。月、日、時、分、秒は2桁として扱い、10未満の場合は先頭に0を付けます。その後、この整数をfloatにstatic_castしますが、精度が失われる場合があります。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

datetimefloatComment
2025-03-14 17:00:01.12345620250314170001精度の損失
9999-12-31 23:59:59.99999999991231235959精度の損失

datetimeからdoubleへ

Strict mode

エラーを返します。

Non-strict mode

datetimeのマイクロ秒部分を破棄し、年、月、日、時、分、秒を順番に連結して整数を形成します。月、日、時、分、秒は2桁として扱い、10未満の場合は先頭に0を付けます。その後、この整数をdoubleにstatic_castします。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

datetimedoubleComment
2025-03-14 17:00:01.1234562025031417000114有効桁数、精度の損失はありません
9999-12-31 23:59:59.99999999991231235959

timeから

Strict mode

エラーを返します。

Non-strict mode

マイクロ秒単位のfloat/double数値に変換します。

ソース型がnullableの場合、nullable型を返します。

ソース型がnon-nullableの場合、non-nullable型を返します。

TimefloatComment
00:00:011000000
838:59:583020398000000
838:59:58.1234563020398123456

他の型から

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