【问题标题】:How can I round up to the nearest multiple of the specified number?如何四舍五入到指定数字的最接近的倍数?
【发布时间】:2016-11-02 03:39:31
【问题描述】:

我已经查看了许多关于四舍五入到最接近数字的倍数的问题,但我不能很好地理解他们的方法来采用它们来四舍五入到 45,或者他们使用其他语言的特定语言方法。

如果上述内容还没有多大意义,这里有一个更详细的解释:

输入示例:

int num1 = 67;
int num2 = 43;

预期结果:

>>round(num1) = 90
>>round(num2) = 45

【问题讨论】:

  • 圆的,天花板的地板?
  • (num + 23)/45*45?
  • 为什么 67 会舍入到 90 而不是 45?
  • 整数除法会截断,即向下取整,因此要向上取整,您只需在除法前添加divisor-1。由于除法和乘法运算符具有相同的优先级并且从左到右执行,因此您可以简单地先除然后乘以导致截断。简而言之,四舍五入为 45 的倍数:val = (val + 44) / 45 * 45
  • @kazenorin 因为 OP 想要四舍五入,而不是最近舍入。

标签: java algorithm numeric


【解决方案1】:

添加缺少的mod45就足够了:

int upperround45(int i) {
    int temp = i%45;
    //For the algorithm we wish the rest to be how much more than last multiple of 45.
    if (temp < 0 ) 
        temp = 45 + temp;
    if (temp == 0) {
        return i;
    } else {
        return i + 45 - temp;
    }
}

编辑:

一般:

int upperround(int num, int base) {
    int temp = num%base;
    if (temp < 0 ) 
        temp = base + temp;
    if (temp == 0) 
        return num;
    return num + base - temp;

【讨论】:

  • 可以使用条件运算符return (temp == 0 ? num : num + base - temp); 缩短它,方法应该是static。另请注意,它无法处理负值。仍然,投票赞成。
  • 我同意否定的观点。在向初学者解释东西时,我不使用条件运算符,因为这对他们来说并不容易。在编译时它们都是相同的,并且对于新手来说阅读我的版本更容易:) 感谢您的支持
  • 那么对于新手来说,你不应该把returnif放在同一行。 ;-) 嗯....我猜我的回答并不能真正帮助新手理解整数数学的复杂性,呵呵。
【解决方案2】:

由于人们在四舍五入到整数的倍数时遇到这样的麻烦,无论是向上/向下/最近四舍五入,这里是非常简单的方法:

public static int roundDown(int value, int multiplier) {
    return value / multiplier * multiplier;
}
public static int roundHalfUp(int value, int multiplier) {
    return (value + multiplier / 2) / multiplier * multiplier;
}
public static int roundUp(int value, int multiplier) {
    return (value + multiplier - 1) / multiplier * multiplier;
}

测试

Value Down Half   Up
    0    0    0    0
    1    0    0    4
    2    0    4    4
    3    0    4    4
    4    4    4    4
Value Down Half   Up
    0    0    0    0
    1    0    0    5
    2    0    0    5
    3    0    5    5
    4    0    5    5
    5    5    5    5

负数

它们不适用于负数。 “向下舍入”通常意味着“向零”,不像 Math.floor() 向负无穷舍入。

这里有可以处理负值的版本。这些与BigDecimal 使用的类似名称的RoundingMode 选项一致。

public static int roundDown(int value, int multiplier) {
    if (multiplier <= 0) throw new IllegalArgumentException();
    return value / multiplier * multiplier;
}
public static int roundHalfUp(int value, int multiplier) {
    if (multiplier <= 0) throw new IllegalArgumentException();
    return (value + (value < 0 ? multiplier / -2 : multiplier / 2)) / multiplier * multiplier;
}
public static int roundUp(int value, int multiplier) {
    if (multiplier <= 0) throw new IllegalArgumentException();
    return (value + (value < 0 ? 1 - multiplier : multiplier - 1)) / multiplier * multiplier;
}

测试

Value Down Half   Up
   -4   -4   -4   -4
   -3    0   -4   -4
   -2    0   -4   -4
   -1    0    0   -4
    0    0    0    0
    1    0    0    4
    2    0    4    4
    3    0    4    4
    4    4    4    4
Value Down Half   Up
   -5   -5   -5   -5
   -4    0   -5   -5
   -3    0   -5   -5
   -2    0    0   -5
   -1    0    0   -5
    0    0    0    0
    1    0    0    5
    2    0    0    5
    3    0    5    5
    4    0    5    5
    5    5    5    5

【讨论】:

  • 非常好的答案!
【解决方案3】:

我能想到的最简单的方法如下

public static int round(int num) {
    return num - num % 45 + (num%45==0? 0 : 45);
}

Tested

int num1 = 67;
int num2 = 43;
int num3 = 90;

System.out.println(num1 - num1 % 45 + (num1%45==0? 0 : 45)); // 90
System.out.println(num2 - num2 % 45 + (num2%45==0? 0 : 45)); // 45
System.out.println(num3 - num3 % 45 + (num3%45==0? 0 : 45)); // 90

【讨论】:

    猜你喜欢
    • 2011-03-25
    • 2021-04-08
    • 2012-03-07
    • 2011-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多