2016-08-17 229 views
1

我在十六進制緯度和經度值:將十六進制轉換爲十進制(Lat/Lon)?

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

您需要先十六進制值解析到int,然後 乘上 1e-7 (更快地通過1e-7通過1e7分裂繁殖),通過1e7 鴻溝。
     感謝@RolandIllig爲pointing out的精度問題。

然而,Integer.parseInt()將不允許將8位十六進制值解析爲負整數值,即當高位打開時。

在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

接受,但劃分的好處是您可以使用Double.toString並獲得預期的結果,而不必使用像'%.7f'這樣的格式。 –

0

第一個數字看起來很簡單:只要通過10.0e6劃分int結果,這是10萬元。

+1

帶符號整數不能包含8個十六進制數字。 – shmosel

+1

概念上它可以,但是'parseInt'如果溢出則拋出異常。 – shmosel

+1

順便說一句,hex2Decimal(「D89B2933」)的實際結果是'-660920013'。 – shmosel

相關問題