我有一个double值d,并想要一个稍微大一点(或更小)的方法来获得一个新的值,该值尽可能接近原始值但仍严格大于(或小于)原始值.
它不必靠近最后一位 - 更重要的是,我所做的任何改变都能保证产生不同的值,而不是回到原始值.
我之所以需要这个,是因为我正在从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);
}
Ste*_*n C 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)在这种情况下会给你答案.
Jon*_*eet 20
使用Double.doubleToRawLongBits和Double.longBitsToDouble:
double d = // your existing value;
long bits = Double.doubleToLongBits(d);
bits++;
d = Double.longBitsToDouble(bits);
Run Code Online (Sandbox Code Playgroud)
该办法IEEE-754的行为,将会给你准确的下一个可行的双,即最小金额比现有的值.
(最终它会击中NaN并可能留在那里,但它应该适用于合理的价值观.)
| 归档时间: |
|
| 查看次数: |
3300 次 |
| 最近记录: |