圆形浮动到更近(或最近的一个)

Round float to closer (or closest one)

我有一些 "reference" 浮点数(例如 1.5、3 和 7.1),有什么方法可以得到其他一些 "random" 浮点数从括号四舍五入到最接近的? (我是说如果有round之类的东西,可以取参考值进行四舍五入)

或者有什么方法可以让一些数字从 2 舍入到更接近的 1(当然除了手动决定)?

我在 Math 中没有找到任何方法,也许是一些外部库? 或者更好的主意是为此编写自己的方法(从括号中获取每个值的绝对差异并获得最小值)? 我知道这很平庸,但它可能很有用..

感谢您的回复

编辑- 例如。: 如果我想

这应该大致符合您的要求:

private static double round(double toRound, double[] numbers) {
    double diff = Math.abs(numbers[0]-toRound);
    double ret = numbers[0];
    for (int i = 1; i < numbers.length; i++) {
        if (Math.abs(numbers[i] - toRound) < diff) {
            diff = Math.abs(numbers[i] - toRound);
            ret = numbers[i];
        }
    }
    return ret;
}

但请注意,当可舍入数的差值相同时,return会return数组中最先出现的数!

更优化的答案:

"for i"方式,更易读

private static double roundForI(double toRound, double[] numbers) {
    int minIndex = 0;
    double minDiff = Double.MAX_VALUE;
    double diff;
    for (int i=0; i<numbers.length; ++i) {
        diff = Math.abs(numbers[i]-toRound);
        if (diff < minDiff) {
            minDiff = diff;
            minIndex = i;
        }
    }
    return numbers[minIndex];
}

更短的一个,"For each"方式

private static double roundForEach(double toRound, double[] numbers) {
    double diff, roundValue = 0, minDiff = Double.MAX_VALUE;
    for (double dob : numbers) {
        if ((diff = Math.abs(dob-toRound)) < minDiff) {
            minDiff = diff;
            roundValue = dob;
        }
    }
    return roundValue;
}

"Java8 Golf Style"方式,这并不比上面的两种方式更好。

private static double roundLambda(double n, double[] a) {
    double[] r = {0}, d = {Double.MAX_VALUE};
    Arrays.stream(a).filter((i)->Math.abs(i-n)<d[0]).forEach(i->{d[0]=Math.abs(i-n);r[0]=i;});
    return r[0];
}