4

假设我有Long someLong = 1004L. 我可以使用什么有效的方法将其四舍五入1000L?请注意,我实际上并不知道,someLong == 1004L所以我不能简单地做someLong -= 4L;. 我需要一个通用的方法。我还希望能够向下舍入 each5而不是 each 10,例如舍入到的函数1005L(因为如果我们按5's 舍入,那么它将向上舍入而不是向下舍入)。

更多示例 .. 可能是我有1926L并且我想四舍五入到5我需要的意思1925L。或者我需要四舍五入到10我需要的意思1930L

4

6 回答 6

7

这很简单。

如果您想始终向下舍入

您需要的公式是:

someLong-someLong%10

这是因为someLong%10someLong除以 10 的余数。如果你从原始数字中得到这个,你会得到你想要的向下舍入的值。

概括也很简单:如果需要,您可以使用 100,甚至 13。

如果你想在另一个方向四舍五入(例如,总是向上舍入或总是向中间四舍五入),那么首先在这个数字上添加一些东西,然后总是向下舍入。


如果您想始终向上取整:

然后首先你需要先加 9,然后总是向下舍入。

someLong+9-(someLong+9)%10

如果您想始终舍入到中间:

...您还想四舍五入到最近的邻居。然后你首先添加所需间隔的一半,然后总是向下舍入。例如,对于 10,它是:

someLong+5-(someLong+5)%10
于 2014-04-11T13:03:15.337 回答
2

如果您想使用 的语义将a 舍value入到最接近的倍数(如果正好在两个步骤之间,则向上舍入),必要的计算是:stepBigDecimal.ROUND_HALF_UP

val += step/2;
val -= val%step;
于 2014-04-11T13:13:05.857 回答
2

四舍五入到最接近的倍数的通用函数k将是(仅适用于正数):

public static long round(long toRound, long k) {
    long times = toRound / k;
    long reminder = toRound % k;
    if (reminder < k / 2)  {
        return k * times;
    } else {
        return k * (times + 1);
    }
}

还有一个无分支变体(reminder < k / 2=> (2 * reminder / k) < 1

public static long round(long toRound, long k) {
    long times = toRound / k;
    long reminder = toRound % k;
    return k * (times + ((2 * reminder) / k));
}
于 2014-04-11T13:12:15.783 回答
2

尝试这个:

double a=1002l;
double b=a/10;

a=Math.round(b)*10;

System.out.println("Double round of value : "+a);
于 2014-04-11T13:03:31.913 回答
1
myFloor(long n, int m) {
  return n - (n % m);
}


myRound(long n, int m) {
  int i = (n % m) >= (m / 2) ? m : 0;
  return n + i - (n % m);
}

m可能是这样10 , 5 , ...

于 2014-04-11T13:07:44.020 回答
1

以下示例达到了您的需要:

public static void main(String[] args) {
    Long n   = 1004L;
    Long n2  = 1005L;

    n = round(n);
    n2 = round(n2);

    System.out.println(n);
    System.out.println(n2);
}

private static Long round(Long n) {
    if (n%10 <=4) {
        return n -=n%10;
    } else {
        return n += (10-n%10);
    }
}
于 2014-04-11T13:15:59.037 回答