Je suis arrivé à une partie de mon programme Java où je devais arrondir à la centaine la plus proche et je pensais qu'il y avait probablement un moyen de le faire mais je suppose que non. J'ai donc cherché sur le réseau des exemples ou des réponses et je n'ai pas encore trouvé de résultats, car tous les exemples semblent être à la centaine près. Je veux juste faire ceci et arrondir UP. Peut-être y a-t-il une solution simple que je néglige. J'ai essayé Math.ceil
et d'autres fonctions, mais je n'ai pas encore trouvé de réponse. Si quelqu'un pouvait m'aider avec ce problème, je l'apprécierais grandement.
Si mon nombre est 203, je veux que le résultat soit arrondi à 300. Vous obtenez le point.
Tirez parti de la division entière, qui tronque la partie décimale du quotient. Pour que cela ressemble à un arrondi, ajoutez 99 en premier.
int rounded = ((num + 99) / 100 ) * 100;
Exemples:
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
Relevant Devis de spécification de langage Java, Section 15.17.2 :
La division entière arrondit à 0. C'est-à-dire le quotient produit pour les opérandes n et d qui sont des entiers après la promotion numérique binaire (§5.6.2) est une valeur entière q dont la grandeur est la plus grande possible en satisfaisant | d · q | ≤ | n |.
Voici un algorithme qui, à mon avis, fonctionne pour tout cas de "multiple de". Laissez-moi savoir ce que vous pensez.
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;
}
Essaye ça:
(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;
}
Exemple:
649: (100 - (649 % 100)) + 649 -> (100 - 49) + 649) -> 51 + 649 = 700
985: (100 - (985 % 100)) + 985 -> (100 - 85) + 985) -> 15 + 985 = 1000
Le type de données long est utilisé pour s'assurer que la limitation de la plage entière ne pose aucun problème pour les valeurs plus grandes. Par exemple, cela pourrait être très important dans le cas d'une valeur en montant (domaine bancaire).
Je n'ai pas assez de réputation pour ajouter un commentaire à O.C. La réponse de mais je pense que cela devrait être:
`
if (number % multiple != 0) {
int division = (number / multiple) + 1;
result = division * multiple;
} else {
result = Math.max(multiple, number);
}
`
avec le else
de sorte que, par exemple round(9, 3) = 9
, sinon ce serait round(9, 3) = 3
Une autre façon consiste à utiliser 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
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));
}
}
Le code ci-dessous fonctionne pour moi pour arrondir un entier au 10, 100, 500 ou 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);
}
}