这是SQL Server 2016 RC0中的转换错误吗?

时间:2016-03-26 06:14:07

标签: sql sql-server sql-server-2016

返回45.2478

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

返回4.524782342440000e+001

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

根据"截断和舍入结果"关于this page的部分看起来CAST应该永远不会截断浮点数,但在这种情况下它会这样做。

3 个答案:

答案 0 :(得分:3)

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

CASTCONVERT相同,但未明确指定可选的样式参数。

  

浮动和真实样式

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

因此,当您使用CAST时,与使用CONVERT的{​​{1}}相同。最多返回6位数,即结果四舍五入为6位数。

答案 1 :(得分:1)

这是由style函数

中提及的CONVERT部分引起的

您使用style = 2

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

结果: 4.524782342440000e+001

但是当我从Style函数

中删除Convert部分时
SELECT CONVERT(VARCHAR(50),geography::STPointFromText('POINT(-81.2545 44.1244)',4326).Lat+1.1234234244)

结果: 45.2478

CAST函数

相同

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

答案 2 :(得分:0)

引用你:"看起来CAST永远不应截断浮动,但在这种情况下它会这样做。"

注意:您在此处撰写的示例不使用float,而是decimal。这是两种不同的类型,区分它们非常重要。默认情况下,decimal有6位数字,可解释此行为。

一切都在制定中。 SQL Server是Microsoft最稳定的软件之一,你几乎找不到它的错误;)