将 Java 双精度映射到保留排序顺序的字符串



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

对于任何一对double d1d2如果Double.compare(d1, d2) < 0doubleToString(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具有相同的行为方法。

您可以将双精度转换为长整型,然后使用类似的方法,就像您已经用于整数一样。我假设以下方法可以根据需要工作(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

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

最好将双精度

的集合保留为双精度或Doubles,并且仅转换为 String 以用于显示或报告目的。

将数字与其字符串表示形式进行比较从来都不是没有好主意的。

但是 - 回答您的问题 - 一个双字符串(d1(是:字符串 s = 字符串.值(d1(;或者简单地:字符串 s = " + d1;

最新更新