我正在寻找一个满足以下条件的方法String doubleToString(double d)
:
对于任何一对double
d1
和d2
如果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
具有相同的行为方法。
您可以将双精度转换为长整型,然后使用类似的方法,就像您已经用于整数一样。我假设以下方法可以根据需要工作(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;