round - redondear cantidades java
Redondeo hasta los cien más cercanos (10)
Aproveche la división de enteros, que trunca la parte decimal del cociente. Para que parezca que se está redondeando, agregue 99 primero.
int rounded = ((num + 99) / 100 ) * 100;
Ejemplos:
801: ((801 + 99) / 100) * 100 → 900 / 100 * 100 → 9 * 100 = 900
99 : ((99 + 99) / 100) * 100 → 198 / 100 * 100 → 1 * 100 = 100
14 : ((14 + 99) / 100) * 100 → 113 / 100 * 100 → 1 * 100 = 100
452: ((452 + 99) / 100) * 100 → 551 / 100 * 100 → 5 * 100 = 500
203: ((203 + 99) / 100) * 100 → 302 / 100 * 100 → 3 * 100 = 300
200: ((200 + 99) / 100) * 100 → 299 / 100 * 100 → 2 * 100 = 200
Cotización relevante de la especificación del lenguaje Java, Sección 15.17.2 :
La división de enteros se redondea hacia 0. Es decir, el cociente producido para los operandos n y d que son enteros después de la promoción numérica binaria (§5.6.2) es un valor entero q cuya magnitud es tan grande como sea posible mientras satisface | d · q | ≤ | n |.
Llegué a una parte de mi programa de Java donde necesito redondear a la centena más cercana y pensé que probablemente había alguna forma de hacerlo, pero supongo que no. Así que busqué en la red ejemplos o respuestas y aún no he encontrado ninguno, ya que todos los ejemplos parecen ser de la centena más cercana. Solo quiero hacer esto y redondear hacia arriba. Tal vez hay alguna solución simple que estoy pasando por alto. He probado Math.ceil
y otras funciones, pero aún no he encontrado una respuesta. Si alguien pudiera ayudarme con este problema lo agradecería enormemente.
Si mi número es 203, quiero que el resultado redondeado sea 300. Obtiene el punto.
- 801-> 900
- 99-> 100
- 14-> 100
- 452-> 500
Aquí hay un algoritmo que creo que funciona para cualquier caso "múltiple de". Déjame saber lo que piensas.
int round (int number,int multiple){
int result = multiple;
//If not already multiple of given number
if (number % multiple != 0){
int division = (number / multiple)+1;
result = division * multiple;
}
return result;
}
El siguiente código me sirve para redondear un número entero a los siguientes 10 o 100 o 500 o 1000, etc.
public class MyClass {
public static void main(String args[]) {
int actualValue = 34199;
int nextRoundedValue = 500 // change this based on your round requirment ex: 10,100,500,...
int roundedUpValue = actualValue;
//Rounding to next 500
if(actualValue%nextRoundedValue != 0)
roundedUpValue =
(((actualValue/nextRoundedValue)) * nextRoundedValue) + nextRoundedValue;
System.out.println(roundedUpValue);
}
}
Esto funcionó perfectamente para mí:
var round100 = function(n) {
if (n < 50) {
var low = n - (n % 100);
return Math.round(low);
}
return Math.round(n/100) * 100;
}
Puedes asignar tus var (variables) a cualquier cosa.
No tengo suficiente reputación para agregar un comentario a la respuesta de , pero creo que debería ser:
`
if (number % multiple != 0) {
int division = (number / multiple) + 1;
result = division * multiple;
} else {
result = Math.max(multiple, number);
}
`
con la else
para que, por ejemplo, round(9, 3) = 9
, de lo contrario sería round(9, 3) = 3
Otra forma es usar BigDecimal
private static double round(double number, int precision, RoundingMode roundingMode) {
BigDecimal bd = null;
try {
bd = BigDecimal.valueOf(number);
} catch (NumberFormatException e) {
// input is probably a NaN or infinity
return number;
}
bd = bd.setScale(precision, roundingMode);
return bd.doubleValue();
}
round(102.23,0,RoundingMode.UP) = 103
round(102.23,1,RoundingMode.UP) = 102.3
round(102.23,2,RoundingMode.UP) = 102.24
round(102.23,-1,RoundingMode.UP) = 110
round(102.23,-2,RoundingMode.UP) = 200
round(102.23,-3,RoundingMode.UP) = 1000
Prueba esto:
(int) (Math.ceil(number/100.0))*100
int roundUpNumberByUsingMultipleValue(double number, int multiple) {
int result = multiple;
if (number % multiple == 0) {
return (int) number;
}
// If not already multiple of given number
if (number % multiple != 0) {
int division = (int) ((number / multiple) + 1);
result = division * multiple;
}
return result;
}
Example:
System.out.println("value 1 =" + round(100.125,100));
System.out.println("value 2 =" + round(163,50));
System.out.println("value 3 =" + round(200,100));
System.out.println("value 4 =" + round(235.33333333,100));
System.out.println("value 5 =" + round(0,100));
OutPut:
value 1 =200
value 2 =200
value 3 =200
value 4 =300
value 5 =0
long i = 2147483648L;
if(i % 100 != 0) {
long roundedI = (100 - (i % 100)) + i;
}
Ejemplo:
649: (100 - (649 % 100)) + 649 -> (100 - 49) + 649) -> 51 + 649 = 700
985: (100 - (985 % 100)) + 985 -> (100 - 85) + 985) -> 15 + 985 = 1000
El tipo de datos largo se utiliza para asegurarse de que la limitación del rango de enteros no debe causar ningún problema para valores más grandes. Por ejemplo, esto podría ser muy importante en el caso de un valor de importe (dominio bancario).
A simple implementation of rgettman which gives:
roudUp(56007)=60000
roudUp(4511)=5000
roudUp(1000)=1000
roudUp(867)=900
roudUp(17)=20
roudUp(5)=10
roudUp(0)=0
import java.util.*;
public class Main {
static int roundUp(int src){
int len = String.valueOf(src).length()-1;
if (len==0) len=1;
int d = (int) Math.pow((double) 10, (double) len);
return (src + (d-1))/d*d;
}
public static void main(String[] args) {
System.out.println("roudUp(56007)="+roundUp(56007));
System.out.println("roudUp(4511)="+roundUp(4511));
System.out.println("roudUp(1000)="+roundUp(1000));
System.out.println("roudUp(867)="+roundUp(867));
System.out.println("roudUp(17)="+roundUp(17));
System.out.println("roudUp(5)="+roundUp(5));
System.out.println("roudUp(0)="+roundUp(0));
}
}