2012-01-17 9 views
2

浮動小数点として格納されている緯度と経度のテーブルがあります。 Latitude列の小数点以下の桁数はどのように数えますか?データは次のようになります。浮動小数点型の列の小数点以下の桁数はどのように数えますか?

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は予期したとおりに動作しませんでした。これは、4桁

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

をキロメートルのためのオリジナルデザインが万キロ=赤道までの距離N極、万だったので、 km≒90°なので、1度あたり約111kmなので、1×10-111≒111×10-11km≒1110×10-12km≒1.11×10-9km≒1×10-6m≒ 1μmである。通常、マイクロメーターレベルでどのオブジェクトのどの部分を参照しているのかを特定するのは少し難しいです。言い換えれば、小数点以下11桁は少なくとも3つ(8桁はおよそミリメートル)、おそらく6つは多すぎます(5つの桁で精度が得られます)。 –

答えて

2

はこれを試してみてください参照してください。

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)は小数点以下4桁で切り捨てるため、この概念は機能しません。 – user918967

1

あなたはしないでください。小数点以下の桁数は、SQLのfloatのサイズによって決まります。どのくらい見るかは、フロートがフォーマットされる方法によって決まります。

0

CONVERTまたはCASTの代わりにSTR関数を使用してください。小数点以下の桁数と文字列の全長をより細かく制御できます。 (そうでない場合はSTRの値を調整し、それはあなたの山車が最大10の小数点以下でなければならないことを前提とし)STR (Transact-SQL)

LEN(RTRIM(REPLACE(STR(Latitude,15,10),'0',' '))) - 5 
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 
関連する問題