2016-08-17 62 views
1

私は16進数で緯度と経度の値だ:16進数を小数点(緯度/経度)に変換しますか?

0AF6CF83 
D89B2933 

私が得た小数に変換し...

183947139 
-660920013 

問題があり、Javaを使用して、次の形式で、これらの小数を取得する方法?

18.3947139 
-66.0920013 

これは私が実際に小数に六角を変換する方法を示します。

public static int hex2Decimal(String s) { 
    long longValue = Long.parseLong(s, 16); 
    int intValue = (int)longValue; 
    return intValue; 
} 

答えて

3

その後 1e-7 (高速1e7除算1e-7によって乗算する) 除算によって1e7によってそのことを掛け、第intにHex値を解析する必要があります。
      pointing outの@RolandIlligのおかげで、精度の問題。

ただし、Integer.parseInt()では、8ビットの16進数の値を負の整数値に解析することはできません。つまり、上位ビットがオンの場合です。

のJava 8で

、あなたがこれを行うだろう:

public static double hex2Decimal(String s) { 
    return Integer.parseUnsignedInt(s, 16)/1e7; 
} 

をあなたのコードは8前のバージョンのJava上で実行する必要がある場合は、次の操作を行います。

public static double hex2Decimal(String s) { 
    return (int)Long.parseLong(s, 16)/1e7; 
} 

テスト

System.out.println(hex2Decimal("0AF6CF83")); 
System.out.println(hex2Decimal("D89B2933")); 

出力

18.3947139 
-66.0920013 
+0

1.0e-7を乗算しないで1.0e7で割ります。もっと正確です。 –

+0

@RolandIllig 'int'値の精度は10桁未満です。したがって、この計算の結果は9-10桁まで正確です。 'double'は15-17桁の精度を持つので、' 1e-7'の不正確さは無意味です。 – Andreas

+2

受け入れられますが、除算には、 '%.7f'のようなフォーマットを使用する代わりに、Double.toStringを使用して期待される結果を得ることができるという利点があります。 –

0

最初の数は非常に簡単になります。ちょうど10百万人である、10.0e6によってint結果を分割します。

+1

符号付き整数は8桁の16進数を保持できません。 – shmosel

+1

概念的には可能ですが、オーバーフローした場合は 'parseInt'が例外をスローします。 – shmosel

+1

ところで、 'hex2Decimal(" D89B2933 ")'の実際の結果は '-660920013'です。 – shmosel

関連する問題