代码之家  ›  专栏  ›  技术社区  ›  Pure.Krome

为什么此SQL Server强制转换(..)将小数舍入为varchar?

  •  3
  • Pure.Krome  · 技术社区  · 14 年前

    我想换一些 decimals varchar 但是他们得到了 圆形的 .

    有人能告诉我为什么吗?

    declare @UpperLeftLatitude DECIMAL,
        @UpperLeftLongitude DECIMAL,
        @BottomRightLatitude DECIMAL,
        @BottomRightLongitude DECIMAL
    
    SET @UpperLeftLatitude = 38.663
    SET @UpperLeftLongitude = -122.857
    SET @BottomRightLatitude = 37.795
    SET @BottomRightLongitude = -121.219
    
    
    DECLARE @SearchRectangleString VARCHAR(MAX);
    SET @SearchRectangleString = 'POLYGON((' + CONVERT(VARCHAR(50), @UpperLeftLatitude) + ' ' + CAST(@UpperLeftLongitude AS VARCHAR(50)) + ',' 
        + CAST(@BottomRightLatitude AS VARCHAR(50)) + ' ' + CAST(@UpperLeftLongitude AS VARCHAR(50)) + ',' 
        + CAST(@BottomRightLatitude AS VARCHAR(50)) + ' ' + CAST(@BottomRightLongitude AS VARCHAR(50)) + ',' 
        + CAST(@UpperLeftLatitude AS VARCHAR(50)) + ' ' + CAST(@BottomRightLongitude AS VARCHAR(50)) + ',' 
        + CAST(@UpperLeftLatitude AS VARCHAR(50)) + ' ' + CAST(@UpperLeftLongitude AS VARCHAR(50)) + '))';
    
        SELECT @SearchRectangleString
    
    -------------------
    POLYGON((39 -123,38 -123,38 -121,39 -121,39 -123))
    
    (1 row(s) affected)
    

    注:是的,我知道我的长/宽是错误的。我很快就换。

    2 回复  |  直到 14 年前
        1
  •  6
  •   cjk    14 年前

    这是因为你的小数没有用长度来表示。它们不存储任何小数位。

    尝试以下操作:

     DECLARE @test DECIMAL, @test2 DECIMAL(8,4)
     SET @test = 12.3456
     SET @test2 = 12.3456
    
     SELECT @test, @test2
    
        2
  •  1
  •   kevchadders    14 年前

    正如CK所说,它是圆的…

    当函数被省略或具有 值为0(默认值), 数值表达式是 圆形的 . 当A 指定的值不是0, 数值表达式被截断。

    来源: ROUND (T-SQL)