我有一个double
值d
,想要一个稍微大一点(或更小)的方法,以获得一个尽可能接近原始值的新值,但仍然严格大于(或小于)原件。
它不必靠近最后一位 - 更重要的是,我所做的任何改变都能保证产生不同的值,而不是回到原来的状态。
(This question has been asked and answered for C, C++)
我需要这个的原因是,我是从Double映射到(某些东西),我可能有多个带有save double'value'的项目,但它们都需要单独进入地图。
我当前的代码(完成工作)如下所示:
private void putUniqueScoreIntoMap(TreeMap map, Double score,
A entry) {
int exponent = 15;
while (map.containsKey(score)) {
Double newScore = score;
while (newScore.equals(score) && exponent != 0) {
newScore = score + (1.0d / (10 * exponent));
exponent--;
}
if (exponent == 0) {
throw new IllegalArgumentException("Failed to find unique new double value");
}
score = newScore;
}
map.put(score, entry);
}
答案 0 :(得分:29)
在Java 1.6及更高版本中,Math.nextAfter(double, double)
方法是获取给定double
值后的下一个double
值的最简洁方法。
第二个参数是您想要的方向。或者,您可以使用Math.nextUp(double)
(Java 1.6及更高版本)获取下一个更大的数字,从Java 1.8开始,您也可以使用Math.nextDown(double)
来获取下一个较小的数字。这两种方法相当于使用带有正或负无穷大的nextAfter
作为方向加倍。
具体来说,Math.nextAfter(score, Double.MAX_VALUE)
会在这种情况下给出答案。
答案 1 :(得分:20)
使用Double.doubleToRawLongBits
和Double.longBitsToDouble
:
double d = // your existing value;
long bits = Double.doubleToLongBits(d);
bits++;
d = Double.longBitsToDouble(bits);
IEEE-754的工作方式,将为您提供完全下一个可行的双倍,即最大量大于现有值。
(最终它会击中NaN并可能留在那里,但它应该适用于合理的价值观。)
答案 2 :(得分:3)
您是否考虑过使用允许多个值存储在同一个密钥(例如二叉树)下而不是尝试破解密钥值的数据结构?
答案 3 :(得分:-2)
d += Double.MIN_VALUE
(或-=
如果你想带走)
答案 4 :(得分:-2)
如何使用Double.MIN_VALUE?
答案 5 :(得分:-4)
使用Double.MIN_VALUE。
它的javadoc:
A constant holding the smallest positive nonzero value of type double, 2-1074. It is equal to the hexadecimal floating-point literal 0x0.0000000000001P-1022 and also equal to Double.longBitsToDouble(0x1L).