2012-01-17 84 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