2012-01-17 96 views
2

我有緯度和經度的表格存儲爲浮點。如何計算緯度列中小數點右側的位數?這些數據將是這個樣子:如何計算浮點列中小數點右邊的位數?

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 

謝謝!

+0

由於原設計公里是萬公里=距離北極到赤道10000 km≈90°,所以每度約111km,所以1×10 -11度≈111×10 -11km≈1110×10 -12km≈1.11×10 -6km≈1×10 -6 m≈ 1微米。通常有點難以確定您在微米級別指向哪個對象的哪個部分。換句話說,11位小數至少有3位太多(8位大約是毫米),大概6位太多(5位可以讓你精確計算)。 – 2012-01-17 23:21:17

回答

2

試試這個(它假定您的花車將在最多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 
0

這可能是無效的TSQL,但將接近:

SELECT LENGTH(CONVERT(varchar(255), Latitude - CAST (Latitude as int))) AS decimal_place_count 
+0

這個概念將不起作用,因爲CONVERT(varchar(255),Latitude)會將其四位小數位打斷。 – user918967 2012-01-17 23:13:31

1

你不知道。小數位數由SQL中的float大小決定。有多少SEE是由浮動格式化的方式決定的。

0

使用STR函數代替CONVERTCAST。它允許您更多地控制小數位數和字符串的總長度。見STR (Transact-SQL)

LEN(RTRIM(REPLACE(STR(Latitude,15,10),'0',' '))) - 5 
1

使用十進制不浮動:

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