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

时间:2010-09-07 11:21:16

标签: java

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

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

(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);
    }

6 个答案:

答案 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.doubleToRawLongBitsDouble.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).