将十六进制转换为十进制(纬度/经度)?
Convert Hex to Decimal (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;
}
第一个数字看起来很简单:只需将 int
结果除以 10.0e6,即 1000 万。
您需要先将十六进制值解析为 int
,然后 将其乘以 1e-7
(乘以 1e-7
会更快除以 1e7
) 除以 1e7
.
感谢@RolandIllig 精度问题。
但是,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
我得到了十六进制的纬度和经度值:
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;
}
第一个数字看起来很简单:只需将 int
结果除以 10.0e6,即 1000 万。
您需要先将十六进制值解析为 int
,然后 将其乘以 除以 1e-7
(乘以 1e-7
会更快除以 1e7
)1e7
.
感谢@RolandIllig
但是,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