将数字四舍五入到最接近的9

时间:2013-10-04 05:16:16

标签: java

我做了一个简单而低效的方法来舍入到最接近的9。 这就是我所拥有的

private int getInventorySize(int max) {
    if (max <= 9){
        return 9;
    }else if (max <= 18){
        return 18;
    }else if (max <= 27){
        return 27;
    }else if (max <= 36){
        return 36;
    }else if (max <= 45){
        return 45;
    }else if (max <= 54){
        return 54;
    }else{
        return 54;
    }

但是你可以看到这种方法不是最好的方法, 有人可以发布一个例子来有效地做到这一点, PS。如果int max大于54 ..它需要返回54 谢谢。

8 个答案:

答案 0 :(得分:4)

你可以这样做:

private int getInventorySize(int max) {
    if (max <= 0) return 9;
    int quotient = (int)Math.ceil(max / 9.0);
    return quotient > 5 ? 54: quotient * 9;
}

将数字除以9.0。并采取上限将为您提供下一个完整的商。如果商为> 5,则只需返回54,否则quotient * 9会为该商提供9的倍数。

一些测试用例:

// Negative number and 0
System.out.println(getInventorySize(-1));  // 9
System.out.println(getInventorySize(0));   // 9

// max <= 9
System.out.println(getInventorySize(5));   // 9
System.out.println(getInventorySize(9));   // 9

// some middle case 
System.out.println(getInventorySize(43));  // 45

// max >= 54
System.out.println(getInventorySize(54));  // 54
System.out.println(getInventorySize(55));  // 54

答案 1 :(得分:1)

查看mod运算符。它是类型%,将产生长除法运算的剩余部分。

一旦你有了余数,你可以大大简化你的舍入。您知道是否需要使用简单的if语句向上或向下舍入。然后找出你需要向上或向下舍入的 9的倍数,用/运算符除以(仅限整数除法)并重新乘以。

答案 2 :(得分:1)

你用这样的模数进行单线程:

return (max>=54) ? 54 : max+(9-max%9)*Math.min(1,max%9);

答案 3 :(得分:0)

private int getInventorySize (int max) {
    if (max < 9) return 9;
    for (int i = 9; i <= 54; i += 9) {
        if (max <= i) {
            return i;
        }
    }
    return 54;
}

答案 4 :(得分:0)

使用公式进行此操作的最简单方法可能是使用整数除法,首先捕获特殊条件:

private int getInventorySize (int max) {
    if (max <  1) return  9;
    if (max > 54) return 54;
    max += 8;
    return max - (max % 9);
}

下表显示了其工作原理:

max   max+8[A]   A%9[B]   A-B
---   --------   ------   ---
 <1                         9
  1          9        0     9
  2         10        1     9
  :
  8         16        7     9
  9         17        8     9
 10         18        0    18
  :
 18         26        8    18
 19         27        0    27
  :
 53         61        7    54
 54         62        8    54
>54                        54

然而,请记住,你在问题中提出的内容没有任何本质上错误的,但你可以大大清理它,使其比基于数学的更容易理解解决方案(如果您的输入范围较大,则不会使用此方法,因为if语句的数量会变得难以处理):

private int getInventorySize (int max) {
    if (max <=  9) return  9;
    if (max <= 18) return 18;
    if (max <= 27) return 27;
    if (max <= 36) return 36;
    if (max <= 45) return 45;
    return 54;
}

使用if ... return ... else构造是完全没必要的,因为else是多余的 - 如果不会发生return已经返回。

同样地,当两个单独的案例可以合并为一个时,没有必要返回54个。

老实说,如果你不期望输入范围增加,我实际上会选择第二种解决方案,因为它的大小实际上更容易被理解。

从下面的测试工具中可以看出,这两种方法都有效(更改哪一个被注释掉以在它们之间切换)。我建议将这里的任何其他答案插入到测试工具中以确保它们也能正常工作(您必须使它们类似static才能使它们按原样工作):

public class Tester {
    private static int getInventorySize (int max) {
        if (max < 1) return 9;
        if (max > 45) return 54;
        max += 8;
        return max - (max % 9);
    }

    //private static int getInventorySize (int max) {
    //    if (max <=  9) return  9;
    //    if (max <= 18) return 18;
    //    if (max <= 27) return 27;
    //    if (max <= 36) return 36;
    //    if (max <= 45) return 45;
    //    return 54;
    //}

    public static void check (int a, int b) {
        int sz = getInventorySize(a); 
        if (sz != b)
            System.out.println ("Error, " + a + " -> " + sz + ", not " + b);
    }

    public static void main (String [] args) {
        for (int i = -9999; i <= 9; i++) check (i, 9);
        for (int i = 10; i <= 54; i += 9) {
            check (i+0, i+8); check (i+1, i+8); check (i+2, i+8);
            check (i+3, i+8); check (i+4, i+8); check (i+5, i+8);
            check (i+6, i+8); check (i+7, i+8); check (i+8, i+8);
        }
        for (int i = 55; i <= 9999; i++) check (i, 54);
    }
}

而且,顺便说一句,我并非完全确定将这些库存整理成一个犹太人(假设函数名称是准确的)。我可以想象你可能想要将下来你的库存(例如想要保留一些库存)的情况,但是四舍五入似乎是一个很大的谎言。

当你进来发现所说的股票实际上已经耗尽时,你打算告诉那些为股票支付好钱的客户?

或者,您是否会为了吸引顾客进入商店而采取任何措施? : - )

答案 5 :(得分:0)

int round(int num) {
        return (num>54)?54:(num%9==0)?num:((num/9)+1)*9;
}

答案 6 :(得分:0)

private int getInventorySize(int max) {
    if (max < 9) {
        return 9;
    }
    if (max <= 54 && max > 9) {
        int a = max / 9;
        return a * 9;
    } else
        return 54;
}

答案 7 :(得分:0)

它非常容易!你走了:

Math.ceil((number/9))*9