Java Version
java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)
En Java, arrondir vers le haut, vers le bas et arrondir les valeurs entières est un peu difficile à comprendre. (Lors de l'échange de données avec le type entier <-> type virgule flottante, cela a tendance à prêter à confusion), donc je pense qu'il est plus sûr de gérer des valeurs numériques avec des chaînes de caractères, donc je vais le laisser comme un mémorandum comme remède.
Je veux arrondir le deuxième chiffre après le point décimal de la valeur numérique d'origine, puis le renvoyer à une valeur entière. EX1) 120->1.20 ---->ROUND_UP 1.20 ->120 ---->ROUND_DOWN 1.20 ->120 ---->ROUND_HALF_UP 1.20 ->120
EX2) 125->1.25 ---->ROUND_UP 1.30 ->130 ---->ROUND_DOWN 1.20 ->120 ---->ROUND_HALF_UP 1.30 ->130
Lors de la manipulation avec java.math.BigDecimal, il est nécessaire d'ajuster le nombre de chiffres effectifs pour la valeur numérique à traiter une fois afin d'arrondir, arrondir vers le bas, arrondir, etc. dans la plage après la virgule décimale.
foo.java
import java.math.BigDecimal;
public class TestCalc {
public static void main(String[] args) {
/* TestData */
Integer val_120 = 120;
Integer val_125 = 125;
Integer digit = 100; // 10^n
BigDecimal bigDval_120 = new BigDecimal(val_120 / digit.doubleValue());
BigDecimal bigDval_125 = new BigDecimal(val_125 / digit.doubleValue());
//Après le point décimal n+Arrondir le premier chiffre
int n = 1;
BigDecimal retRoundUp_120 = bigDval_120.setScale(n, BigDecimal.ROUND_UP);
BigDecimal retRoundDown_120 = bigDval_120.setScale(n, BigDecimal.ROUND_DOWN);
BigDecimal retRoundHalfUp_120 = bigDval_120.setScale(n, BigDecimal.ROUND_HALF_UP);
BigDecimal retRoundUp_125 = bigDval_125.setScale(n, BigDecimal.ROUND_UP);
BigDecimal retRoundDown_125 = bigDval_125.setScale(n, BigDecimal.ROUND_DOWN);
BigDecimal retRoundHalfUp_125 = bigDval_125.setScale(n, BigDecimal.ROUND_HALF_UP);
//Arrondir / arrondir vers le bas / arrondir
System.out.println(retRoundUp_120 + "<--" + bigDval_120);
System.out.println(retRoundDown_120 + "<--" + bigDval_120);
System.out.println(retRoundHalfUp_120 + "<--" + bigDval_120);
System.out.println(retRoundUp_125 + "<--" + bigDval_125);
System.out.println(retRoundDown_125 + "<--" + bigDval_125);
System.out.println(retRoundHalfUp_125 + "<--" + bigDval_125);
//Convertir en int
System.out.println(retRoundUp_120.intValue() + "<--" + retRoundUp_120);
System.out.println(retRoundDown_120.intValue() + "<--" + retRoundDown_120);
System.out.println(retRoundHalfUp_120.intValue() + "<--" + retRoundHalfUp_120);
System.out.println(retRoundUp_125.intValue() + "<--" + retRoundUp_125);
System.out.println(retRoundDown_125.intValue() + "<--" + retRoundDown_125);
System.out.println(retRoundHalfUp_125.intValue() + "<--" + retRoundHalfUp_125);
}
}
Résultat d'exécution
1.2<--1.1999999999999999555910790149937383830547332763671875
1.1<--1.1999999999999999555910790149937383830547332763671875
1.2<--1.1999999999999999555910790149937383830547332763671875
1.3<--1.25
1.2<--1.25
1.3<--1.25
1<--1.2
1<--1.1
1<--1.2
1<--1.3
1<--1.2
1<--1.3
foo.java
import java.math.BigDecimal;
public class TestCalc {
public static void main(String[] args) {
/* TestData */
BigDecimal bigDval_120 = new BigDecimal("1.20");
BigDecimal bigDval_125 = new BigDecimal("1.25");
//Après le point décimal n+Arrondir le premier chiffre
int n = 1;
BigDecimal retRoundUp_120 = bigDval_120.setScale(n, BigDecimal.ROUND_UP);
BigDecimal retRoundDown_120 = bigDval_120.setScale(n, BigDecimal.ROUND_DOWN);
BigDecimal retRoundHalfUp_120 = bigDval_120.setScale(n, BigDecimal.ROUND_HALF_UP);
BigDecimal retRoundUp_125 = bigDval_125.setScale(n, BigDecimal.ROUND_UP);
BigDecimal retRoundDown_125 = bigDval_125.setScale(n, BigDecimal.ROUND_DOWN);
BigDecimal retRoundHalfUp_125 = bigDval_125.setScale(n, BigDecimal.ROUND_HALF_UP);
//Arrondir / arrondir vers le bas / arrondir
System.out.println(retRoundUp_120 + "<--" + bigDval_120);
System.out.println(retRoundDown_120 + "<--" + bigDval_120);
System.out.println(retRoundHalfUp_120 + "<--" + bigDval_120);
System.out.println(retRoundUp_125 + "<--" + bigDval_125);
System.out.println(retRoundDown_125 + "<--" + bigDval_125);
System.out.println(retRoundHalfUp_125 + "<--" + bigDval_125);
//Convertir en int
System.out.println(retRoundUp_120.intValue() + "<--" + retRoundUp_120);
System.out.println(retRoundDown_120.intValue() + "<--" + retRoundDown_120);
System.out.println(retRoundHalfUp_120.intValue() + "<--" + retRoundHalfUp_120);
System.out.println(retRoundUp_125.intValue() + "<--" + retRoundUp_125);
System.out.println(retRoundDown_125.intValue() + "<--" + retRoundDown_125);
System.out.println(retRoundHalfUp_125.intValue() + "<--" + retRoundHalfUp_125);
}
}
Résultat d'exécution
1.2<--1.20
1.2<--1.20
1.2<--1.20
1.3<--1.25
1.2<--1.25
1.3<--1.25
1<--1.2
1<--1.2
1<--1.2
1<--1.3
1<--1.2
1<--1.3
À partir de ce qui précède, BigDecimal nécessite une garde d'enfants lors de la conversion en une valeur entière à virgule flottante, qu'elle soit gérée en tant que type à virgule flottante ou type chaîne de caractères.
foo.java
import java.math.BigDecimal;
public class TestCalc {
public static void main(String[] args) {
/* TestData */
int val_120 = 120;
int val_125 = 125;
Integer digit = 100; // 10^(n+1)
BigDecimal bigDval_120 = new BigDecimal(val_120 / digit.doubleValue());
BigDecimal bigDval_125 = new BigDecimal(val_125 / digit.doubleValue());
//Après le point décimal n+Arrondir le premier chiffre
int n = 1;
BigDecimal retRoundUp_120 = bigDval_120.setScale(n, BigDecimal.ROUND_UP);
BigDecimal retRoundDown_120 = bigDval_120.setScale(n, BigDecimal.ROUND_DOWN);
BigDecimal retRoundHalfUp_120 = bigDval_120.setScale(n, BigDecimal.ROUND_HALF_UP);
BigDecimal retRoundUp_125 = bigDval_125.setScale(n, BigDecimal.ROUND_UP);
BigDecimal retRoundDown_125 = bigDval_125.setScale(n, BigDecimal.ROUND_DOWN);
BigDecimal retRoundHalfUp_125 = bigDval_125.setScale(n, BigDecimal.ROUND_HALF_UP);
//Arrondir / arrondir vers le bas / arrondir
System.out.println(retRoundUp_120 + "<--" + bigDval_120);
System.out.println(retRoundDown_120 + "<--" + bigDval_120);
System.out.println(retRoundHalfUp_120 + "<--" + bigDval_120);
System.out.println(retRoundUp_125 + "<--" + bigDval_125);
System.out.println(retRoundDown_125 + "<--" + bigDval_125);
System.out.println(retRoundHalfUp_125 + "<--" + bigDval_125);
//Augmenter les chiffres avant de convertir en int
System.out.println(Double.valueOf(retRoundUp_120.doubleValue() * digit).intValue()+"<--"+retRoundUp_120.doubleValue() * digit + "<--" + retRoundUp_120);
System.out.println(Double.valueOf(retRoundDown_120.doubleValue() * digit).intValue()+"<--"+retRoundDown_120.doubleValue() * digit + "<--" +retRoundDown_120);
System.out.println(Double.valueOf(retRoundHalfUp_120.doubleValue() * digit).intValue()+"<--"+retRoundHalfUp_120.doubleValue() * digit + "<--" +retRoundHalfUp_120);
System.out.println(Double.valueOf(retRoundUp_125.doubleValue() * digit).intValue()+"<--"+retRoundUp_125.doubleValue() * digit + "<--" +retRoundUp_125);
System.out.println(Double.valueOf(retRoundDown_125.doubleValue() * digit).intValue()+"<--"+retRoundDown_125.doubleValue() * digit + "<--" +retRoundDown_125);
System.out.println(Double.valueOf(retRoundHalfUp_125.doubleValue() * digit).intValue()+"<--"+retRoundHalfUp_125.doubleValue() * digit + "<--" +retRoundHalfUp_125);
}
}
Résultat d'exécution
1.2<--1.1999999999999999555910790149937383830547332763671875
1.1<--1.1999999999999999555910790149937383830547332763671875
1.2<--1.1999999999999999555910790149937383830547332763671875
1.3<--1.25
1.2<--1.25
1.3<--1.25
120<--120.0<--1.2
110<--110.00000000000001<--1.1
120<--120.0<--1.2
130<--130.0<--1.3
120<--120.0<--1.2
130<--130.0<--1.3
import java.math.BigDecimal;
public class TestCalc {
public static void main(String[] args) {
/* TestData */
Integer digit = 100; // 10^(n+1)
BigDecimal bigDval_120 = new BigDecimal("1.20");
BigDecimal bigDval_125 = new BigDecimal("1.25");
//Après le point décimal n+Arrondir le premier chiffre
int n = 1;
BigDecimal retRoundUp_120 = bigDval_120.setScale(n, BigDecimal.ROUND_UP);
BigDecimal retRoundDown_120 = bigDval_120.setScale(n, BigDecimal.ROUND_DOWN);
BigDecimal retRoundHalfUp_120 = bigDval_120.setScale(n, BigDecimal.ROUND_HALF_UP);
BigDecimal retRoundUp_125 = bigDval_125.setScale(n, BigDecimal.ROUND_UP);
BigDecimal retRoundDown_125 = bigDval_125.setScale(n, BigDecimal.ROUND_DOWN);
BigDecimal retRoundHalfUp_125 = bigDval_125.setScale(n, BigDecimal.ROUND_HALF_UP);
//Arrondir / arrondir vers le bas / arrondir
System.out.println(retRoundUp_120 + "<--" + bigDval_120);
System.out.println(retRoundDown_120 + "<--" + bigDval_120);
System.out.println(retRoundHalfUp_120 + "<--" + bigDval_120);
System.out.println(retRoundUp_125 + "<--" + bigDval_125);
System.out.println(retRoundDown_125 + "<--" + bigDval_125);
System.out.println(retRoundHalfUp_125 + "<--" + bigDval_125);
//Augmenter les chiffres avant de convertir en int
System.out.println(Double.valueOf(retRoundUp_120.doubleValue() * digit).intValue()+"<--"+retRoundUp_120.doubleValue() * digit + "<--" + retRoundUp_120);
System.out.println(Double.valueOf(retRoundDown_120.doubleValue() * digit).intValue()+"<--"+retRoundDown_120.doubleValue() * digit + "<--" +retRoundDown_120);
System.out.println(Double.valueOf(retRoundHalfUp_120.doubleValue() * digit).intValue()+"<--"+retRoundHalfUp_120.doubleValue() * digit + "<--" +retRoundHalfUp_120);
System.out.println(Double.valueOf(retRoundUp_125.doubleValue() * digit).intValue()+"<--"+retRoundUp_125.doubleValue() * digit + "<--" +retRoundUp_125);
System.out.println(Double.valueOf(retRoundDown_125.doubleValue() * digit).intValue()+"<--"+retRoundDown_125.doubleValue() * digit + "<--" +retRoundDown_125);
System.out.println(Double.valueOf(retRoundHalfUp_125.doubleValue() * digit).intValue()+"<--"+retRoundHalfUp_125.doubleValue() * digit + "<--" +retRoundHalfUp_125);
}
}
Résultat d'exécution
1.2<--1.20
1.2<--1.20
1.2<--1.20
1.3<--1.25
1.2<--1.25
1.3<--1.25
120<--120.0<--1.2
120<--120.0<--1.2
120<--120.0<--1.2
130<--130.0<--1.3
120<--120.0<--1.2
130<--130.0<--1.3
Il semble qu'il soit préférable d'ajuster le nombre de chiffres effectifs de la virgule décimale dans le type de chaîne de caractères, mais à la fin, ce doit être le type entier, donc je vais essayer de trouver une meilleure méthode.
Si vous souhaitez uniquement arrondir, vous pouvez utiliser Math.round, mais si vous souhaitez utiliser arrondi ou dévaluation, vous utiliserez probablement Big Decimal.
test.java
double d1 = 0.50;
double d2 = 0.25;
System.out.println(Math.round(d1)+":"+Math.round(d2));
Résultat d'exécution
1:0
Recommended Posts