2016-08-17 231 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

相关问题