【问题标题】:Round float to closer (or closest one)圆形浮动到更近(或最近的一个)
【发布时间】:2015-11-23 14:29:53
【问题描述】:

我有一些“参考”浮点数(例如 1.5、3 和 7.1),有没有办法让其他一些“随机”浮点数四舍五入到最接近的浮点数括号中的强>? (我的意思是如果有类似round的东西,它可以取参考值进行四舍五入)

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

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

感谢您的回复

编辑- 例如。: 如果我愿意

  • "round" 1,得到 1.5
  • 第5轮,获得3
  • 第8轮,得到7.7
  • 第 1.7 轮,得到 1.5

等等。

【问题讨论】:

  • 你能举一些例子来说明你的意思吗?这对我们来说很容易理解..
  • 所以你想“四舍五入”2.24 to 1.52.26 to 35.04 to 35.06 to 7.1?如果是这样,则不适用正常的四舍五入规则(例如,向上四舍五入但不包括 0.5,在 0.5 之后向上四舍五入),您必须制定自己的规则。
  • 不,不,我的意思是例如。数字“四舍五入” - 1.8 - 所以从括号中获得最接近的一个 - 所以在这种情况下是 1.5,数字要四舍五入 - 5.2 - 得到 7.1,3 得到 3,4 得到 3,等等。
  • 哈,在这种情况下会有问题,例如。如果我想进行第 2 轮,因为 0.5 到 3 和 1.5 x) 之间存在差异,但只是举例 :) 抱歉,hinneLinks,你的示例看起来很棒 :)
  • 你不需要得到每个值的差异:如果你的参考数字数组是排序的,你可以对你的结果进行二进制搜索,两个邻居就是你需要的检查距离。其他所有元素必然会更进一步。

标签: java numbers rounding


【解决方案1】:

更优化的答案:

“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”方式,这并不比上面的2更好。

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];
}

【讨论】:

    【解决方案2】:

    这应该大致做你想要的:

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

    但请注意,当可取整数字中要取整为2的数字之差相同时,会返回数组中排在第一位的数字!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 2016-09-06
      • 2014-05-06
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多