这是 SQL Server 2016 RC0 中的铸造错误吗?

Is this a casting bug in SQL Server 2016 RC0?

Returns 45.2478

SELECT
    CAST(
        geography::STPointFromText( 'POINT(-81.2545 44.1244)', 4326 ).Lat + 1.12342342
        AS VARCHAR(50)
    )

Returns 4.524782342440000e+001

SELECT
    CONVERT(
        VARCHAR(50),
        geography::STPointFromText( 'POINT(-81.2545 44.1244)' , 4326 ).Lat + 1.1234234244,
        2
    )

根据 this page 上的 "Truncating and Rounding Results" 部分,看起来 CAST 永远不应该截断浮点数,但在这种情况下它正在这样做。

这是由于您在 CONVERT 函数中提到的 style 部分

您的查询 style = 2

SELECT CONVERT(VARCHAR(50),geography::STPointFromText('POINT(-81.2545 44.1244)',4326).Lat+1.1234234244,2)

结果: 4.524782342440000e+001

但是当我从 Convert 函数中删除 Style 部分时

SELECT CONVERT(VARCHAR(50),geography::STPointFromText('POINT(-81.2545 44.1244)',4326).Lat+1.1234234244)

结果: 45.2478

CAST函数相同

仅供参考, 样式 2 用于将日期格式化为 yy.mm.dd 格式

您在问题中包含的文档的 link 有答案。

CASTCONVERT 相同,但未显式指定可选样式参数。

float and real Styles

Value:  0 (default)
Output: A maximum of 6 digits. Use in scientific notation, when appropriate.

因此,当您使用 CAST 时,它与使用 CONVERTstyle=0 是一样的。其中returns最多6位,即结果四舍五入为6位。

你的话:"it looks like CAST should never truncate a float but it's doing it in this case."

注意:你这里写的例子没有用float,而是decimal。这是两种不同的类型,区分它们非常重要。 decimal默认有 6 位数字,这解释了这种行为。

一切尽在掌握。 SQL服务器是微软最稳定的软件之一,你几乎不会在那里发现错误;)