如何四舍五入到指定数字的最接近倍数?
How can I round up to the nearest multiple of the specified number?
我看过很多关于四舍五入到数字的最接近倍数的问题,但我无法很好地理解他们的方法以采用它们来四舍五入到 45 或者他们使用其他语言的特定语言方法.
如果上面的内容还不太明白,这里有更详细的解释:
示例输入:
int num1 = 67;
int num2 = 43;
预期结果:
>>round(num1) = 90
>>round(num2) = 45
补上缺少的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;
我能想到的最简单的方法如下
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
由于人们在舍入到整数的倍数时遇到这样的麻烦,是否舍入 up/down/nearest,这里有非常简单的方法:
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
负数
它们不适用于负数。 "Round down" 通常表示 "towards zero",不像 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
我看过很多关于四舍五入到数字的最接近倍数的问题,但我无法很好地理解他们的方法以采用它们来四舍五入到 45 或者他们使用其他语言的特定语言方法.
如果上面的内容还不太明白,这里有更详细的解释:
示例输入:
int num1 = 67;
int num2 = 43;
预期结果:
>>round(num1) = 90
>>round(num2) = 45
补上缺少的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;
我能想到的最简单的方法如下
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
由于人们在舍入到整数的倍数时遇到这样的麻烦,是否舍入 up/down/nearest,这里有非常简单的方法:
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
负数
它们不适用于负数。 "Round down" 通常表示 "towards zero",不像 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