【问题标题】:Convert Hex to Decimal (Lat / Lon)?将十六进制转换为十进制(纬度/经度)?
【发布时间】:2016-08-17 23:54:34
【问题描述】:

我得到了一个十六进制的纬度和经度值:

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;
}

【问题讨论】:

    标签: java hex decimal latitude-longitude


    【解决方案1】:

    您需要先将十六进制值解析为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;
    }
    

    如果您的代码需要在 Java 8 之前的版本上运行,请执行以下操作:

    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
    

    【讨论】:

    • 不要与 1.0e-7 相乘,而是除以 1.0e7。它更精确。
    • @RolandIllig int 值的精度小于 10 位,因此该计算的结果只能精确到 9-10 位。 double 有 15-17 位的精度,所以 1e-7 的任何不精确都是没有意义的。
    • 已接受,但除法的好处是您可以只使用 Double.toString 并获得预期的结果,而不必使用像 %.7f 这样的格式。
    【解决方案2】:

    第一个数字看起来很简单:只需将int 结果除以 10.0e6,即 1000 万。

    【讨论】:

    • 有符号整数不能容纳 8 个十六进制数字。
    • 理论上可以,但是parseInt如果溢出就会抛出异常。
    • 顺便说一下hex2Decimal("D89B2933")的实际结果是-660920013
    • 感谢指正,没想到Java这么严格。
    • 查看实际数字和预期数字很明显,因为数字相同。
    猜你喜欢
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 2021-12-26
    • 2018-01-10
    • 1970-01-01
    • 2013-11-27
    • 2013-01-05
    相关资源
    最近更新 更多