4

我有存储为浮点的纬度和经度表。如何计算纬度列中小数点右侧的位数?数据看起来像这样:

    DECLARE @MyData TABLE (ID, Latitude float, Longitude float)
    INSERT @MyData

    SELECT 'A', 33.11, -55.2235 UNION ALL
    SELECT 'B', 33.6407760431,-87.0002760543 UNION ALL
    SELECT 'C', 42.2997,-70.9081; 

我想要这个

    ID    |   LatitudeNumberOfDigits
     A    |    2
     B    |   10
     C    |    4

我试图将其转换为文本并使用 . 作为分隔符,但 CONVERT 没有按预期工作。四舍五入到四位有效数字

    SELECT ID, Latitude, Longitude, 
    CONVERT(varchar(max),[Latitude]) AS LatText 
    FROM @MyData

给我

     ID Latitude    Longitude        LatText
     A  33.11           -55.2235         33.11
     B  33.6407760431   -87.0002760543   33.6408
     C  42.2997         -70.9081         42.2997

谢谢 !

4

6 回答 6

3

试试这个(它假设你的浮点数最多有 10 个小数位,否则调整 STR 中的值)。

WITH MyData (ID, Latitude, Longitude)
AS
(
    SELECT 'A', CAST(33.11 AS FLOAT), CAST(-55.2235 AS FLOAT) UNION ALL
    SELECT 'B', 33.6407760431,-87.0002760543 UNION ALL
    SELECT 'C', 42.2997,-70.9081 
)
SELECT ID, Latitude, Longitude, 
    LEN(CAST(REVERSE(SUBSTRING(STR([Latitude], 13, 11), CHARINDEX('.', STR([Latitude], 13, 11)) + 1, 20)) AS INT)) AS LatText  
FROM MyData

然而,正如其他人所指出的,FLOAT 可能会让您有些头疼。例如考虑这个:

SELECT STR(33.11, 20,17) -- result: 33.1099999999999990
于 2012-01-17T23:12:53.963 回答
1

你没有。小数位数由 SQL 中浮点数的大小决定。你看到多少取决于浮点数的格式。

于 2012-01-17T23:04:32.230 回答
1

使用 DECIMAL 而不是 FLOAT:

DECLARE @a FLOAT = 33.6407760431
SELECT CAST(@a AS VARCHAR(100))

DECLARE @b DECIMAL(22,10) = 33.6407760431
SELECT CAST(@b AS VARCHAR(100))

回报:

33.6408

33.6407760431
于 2012-01-18T03:59:48.610 回答
1

转换为数字(maxprecision,maxscale)。然后使用 case 语句进行迭代。

declare @value as numeric(19,5) = 123.12647

select 
CASE WHEN @value = round(@value,0) then 0
     WHEN @value = round(@value,1) then 1
     WHEN @value = round(@value,2) then 2
     WHEN @value = round(@value,3) then 3
     WHEN @value = round(@value,4) then 4
     else 5 end
于 2018-03-13T21:53:48.470 回答
0

这可能不是有效的 tsql,但它会很接近:

SELECT LENGTH(CONVERT(varchar(255), Latitude - CAST (Latitude as int))) AS decimal_place_count 
于 2012-01-17T23:03:52.540 回答
0

使用STR函数代替CONVERTor CAST。它允许您更好地控制小数位数和字符串的总长度。请参见STR (Transact-SQL)

LEN(RTRIM(REPLACE(STR(Latitude,15,10),'0',' '))) - 5
于 2012-01-17T23:09:15.330 回答