将Java double映射到String保留排序顺序

时间:2017-05-18 18:17:38

标签: java double

我正在寻找满足以下条件的方法String doubleToString(double d)

对于任何一对double d1d2 Double.compare(d1, d2) < 0然后doubleToString(d1).compareTo(doubleToString(d2)) < 0

为了说明需要,我为int类型写了一个类似的方法:

public static String intToString(int i) {
    String string = Integer.toHexString(i - Integer.MIN_VALUE);
    return "00000000".substring(string.length()) + string;
}

结果(每个下一个String都大于前一个):

intToString(-2147483648) = intToString(0x80000000) = "00000000"
intToString(-10)         = intToString(0xfffffff6) = "7ffffff6"
intToString(-1)          = intToString(0xffffffff) = "7fffffff"
intToString(0)           = intToString(0x0)        = "80000000"
intToString(1)           = intToString(0x1)        = "80000001"
intToString(10)          = intToString(0xa)        = "8000000a"
intToString(2147483647)  = intToString(0x7fffffff) = "ffffffff"

我想要的是为double提供相同的行为方法。

3 个答案:

答案 0 :(得分:3)

您可以将双打转换为long,然后使用类似已经用于整数的方法。我假设以下方法可以正常工作(NaN被视为最大数字):

public static String doubleToString(double d) {
    final long bits = Double.doubleToLongBits(d);
    final String s = Long.toString(bits);
    return (bits < 0 ? "--------------------" : "00000000000000000000").substring(s.length()) + s;
}

输入和输出示例:

[-Infinity, -1.7976931348623157E308, -4.9E-324, -0.0, 0.0, 4.9E-324, 1.7976931348623157E308, Infinity]
----4503599627370496
----4503599627370497
-9223372036854775807
-9223372036854775808
00000000000000000000
00000000000000000001
09218868437227405311
09218868437227405312

答案 1 :(得分:0)

您已经走上正轨,但您需要为整体部分提供最多16个前导零。小数部分可以任意长,因此您不能根据string.length()代码使用int

最好将双打集合保持为双精度或Doubles,并且仅转换为字符串以用于显示或报告目的。

答案 2 :(得分:-1)

将数字与其字符串表示进行比较绝不是一个好主意。

然而 - 回答你的问题 - doubleToString(d1) 是: String s = String.valueOf(d1); 或者干脆: String s =&#34;&#34; + d1;