【问题标题】:Is this a casting bug in SQL Server 2016 RC0?这是 SQL Server 2016 RC0 中的铸造错误吗?
【发布时间】:2016-03-26 06:14:06
【问题描述】:

返回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 不应该截断浮点数,但在这种情况下它正在这样做。

【问题讨论】:

  • 您的示例使用的文字类型为 decimal 而不是 float
  • @MartinSmith 非常感谢,这让我发疯了,我删除了文字十进制示例,它现在只是浮动。假设 float+decimal = float

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


【解决方案1】:

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

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

浮动和真实样式

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

因此,当您使用CAST 时,它与使用CONVERTstyle=0 相同。最多返回 6 位,即结果四舍五入为 6 位。

【讨论】:

    【解决方案2】:

    这是由于您在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 格式

    【讨论】:

      【解决方案3】:

      引用你的话:“看起来 CAST 不应该截断浮点数,但在这种情况下它正在这样做。”

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

      一切都在检查中。 SQL Server 是 Microsoft 最稳定的软件之一,您几乎不会在其中发现错误 ;)

      【讨论】:

      • 我从示例中删除了所有小数,现在应该都是浮点数,假设浮点数+十进制=浮点数。另外我使用的是 RC0 版本的 SQL 服务器,我已经遇到了已知的错误,它是预发布软件。
      猜你喜欢
      • 2015-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-31
      • 2011-02-07
      • 1970-01-01
      相关资源
      最近更新 更多