跳到主要内容

转换为 float/double

From string

行为变更

自 4.0 起,溢出时结果不再是NULL,而是+/-Infinity。

严格模式

如果源类型是nullable,返回nullable类型;

如果源类型是非nullable,返回非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>

规则描述

  • 只支持十进制格式的数字;

  • 支持科学计数法;

  • 数字前面可以带有正负符号字符;

  • 字符串允许有任意数量的前缀空格和后缀空格,空格字符包括:" ", "\t", "\n", "\r", "\f", "\v";

  • 支持Infinity和NaN;

  • 其它格式报错;

  • 溢出转成+|-Infinity。

例子

字符串float/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"报错非法格式。
"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>

规则描述

  • 支持严格模式下的所有合法格式;

  • 非法格式转成NULL值;

  • 溢出转成+|-Infinity。

例子

字符串float/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溢出

From bool

true转成1,false转成0。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

From integer

遵守c++ static cast语义。可能会丢失精度。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

From float to double

遵守c++ static cast语义。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

From double to float

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

规则描述

  • 遵守c++ static cast语义。

  • 溢出时转成+-Infinity。

例子

doublefloatComment
1.79769e+308Infinity溢出
-1.79769e+308-Infinity溢出

From decimal to float

Decimal类型cast成float有可能会丢失精度。

Doris的Decimal(p, s)类型,在内存中实际是用整数表示的,整数的值等于Decimal实际值 * 10^s。例如,一个Decimal(10, 6)的值1234.56789,在内存中是用整数值1234567890表示的。

将Decimal类型转为float或者double类型时,Doris实际是执行以下操作:static_cast<float>(内存中的整数值) / (10 ^scale)

严格模式

溢出时转成Infinity。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

Decimal(76, 6)floatComment
123456789.012345123456790cast成float会丢失精度
9999999999999999999999999999999999999999999999999999999999999999999999.123456Infinity溢出

非严格模式

溢出时转成Infinity。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

Decimal(76, 6)floatComment
123456789.012345123456790cast成float会丢失精度。
9999999999999999999999999999999999999999999999999999999999999999999999.123456Infinity溢出

From decimal to double

目前Decimal类型有效数字最多是76位,cast成double类型不存在溢出问题,只会存在丢失精度问题。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

Decimal(76, 6)doubleComment
123456789.012345123456789.012345有效位数是15位,cast成double不会丢失精度。
12345678901.01234512345678901.012344有效位数是17位,cast成double会丢失精度。
9999999999999999999999999999999999999999999999999999999999999999999999.1234561e+70会丢失精度。

From date to float

严格模式

报错。

非严格模式

将date的年月日的数字按顺序拼成整数,月、日都当成两位数,不足10的在前面补一个0。然后将这个整数static_cast成float,可能会丢失精度。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

datefloatComment
2025-04-2120250420丢失精度

From date to double

严格模式

报错。

非严格模式

将date的年月日的数字按顺序拼成整数,月、日都当成两位数,不足10的在前面补一个0。然后将这个整数static_cast成double。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

datedoubleComment
2025-04-21202504218位有效数字,不会丢失精度

From datetime to float

严格模式

报错。

非严格模式

将datetime的microsend部分丢弃,然后将年、月、日、小时、分钟、秒按顺序拼接成一个整数,月、日、小时、分钟、秒都当成两位数,不足10的在前面补一个0。然后将这个整数static_cast成float,会丢失精度。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

datetimefloatComment
2025-03-14 17:00:01.12345620250314000000丢失精度
9999-12-31 23:59:59.99999999991234000000丢失精度

From datetime to double

严格模式

报错。

非严格模式

将datetime的microsend部分丢弃,然后将年、月、日、小时、分钟、秒按顺序拼接成一个整数,月、日、小时、分钟、秒都当成两位数,不足10的在前面补一个0。然后将这个整数static_cast成double。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

datetimedoubleComment
2025-03-14 17:00:01.1234562025031417000114位有效数字,不会丢失精度
9999-12-31 23:59:59.99999999991231235959

From time

严格模式

报错

非严格模式

转换成以微秒为单位的float/double数字。

如果源类型是nullable,返回nullable类型。

如果源类型是非nullable,返回非nullable类型。

例子

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

From其它类型

不支持