如何通过Java中最小的增量来改变浮点数?

bar*_*red 17 java

我有一个doubled,并想要一个稍微大一点(或更小)的方法来获得一个新的值,该值尽可能接近原始值但仍严格大于(或小于)原始值.

它不必靠近最后一位 - 更重要的是,我所做的任何改变都能保证产生不同的值,而不是回到原始值.

(这个问题已被提出并回答了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);
    }

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.doubleToRawLongBitsDouble.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并可能留在那里,但它应该适用于合理的价值观.)

  • @Erick:因为那不起作用:)请参阅我对理查德答案的评论. (3认同)