[Note] Gestion des points décimaux Java

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)

Gestion des points décimaux

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

Lors de la capture de la valeur numérique à traiter comme une chaîne de caractères

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.

Pour le type entier

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

Pour le type de chaîne

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.

De côté

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

[Note] Gestion des points décimaux Java
Gestion de la virgule flottante java Lors de la lecture du livre de référence [Note]
[Java] Pratique de la gestion des exceptions [Exception]
Gestion des fuseaux horaires avec Java
Comptez le nombre de chiffres après la virgule décimale en Java
Compréhension étape par étape de la gestion des exceptions Java
Connaissance de base de la rédaction de notes de développement Java
Gestion des exceptions Java?
Java Big Decimal
[Java] Gestion des exceptions
☾ Java / Gestion des exceptions
À propos de la gestion des exceptions Java
Gestion des exceptions Java
[Java] Présentation de Java
[Java] Gestion des Java Beans dans la chaîne de méthodes
[Note] Java: mesure la vitesse de concaténation de chaînes
[Note] Java: vitesse de traitement de la liste par objectif
Collection expirée de java
Modificateur abstrait Java [Note]
[Java] Notes de l'itérateur interne
[Java] Importance de serialVersionUID
Veuillez noter la division (division) de java kotlin Int et Int
NIO.2 examen de Java
Avis sur Java Shilber
java --Unification des commentaires
Mémo simple de JUnit de java
[java] Java SE 8 Silver Note
Histoire des annotations Java
[Note] Java: recherche de chaînes de caractères
[Note] Java: enquête sur les chaînes de caractères
java (mérites du polymorphisme)
Ma note d'étude (Java)
Examen NIO de Java
[Java] Trois fonctionnalités de Java
Résumé du support Java 2018
[Java] Gestion des chaînes de caractères (classe String et classe StringBuilder)
java: Ajouter une date [Note]
[java] Nombre de déclin → nombre n-aire nombre n-aire → nombre décimal
[Note] Sortie Java de la somme des éléments pairs et impairs
À propos du comportement par défaut de l'arrondi des fractions à l'aide de java.text.NumberFormat
[Introduction à Java] Gestion des chaînes de caractères (classe String, classe StringBuilder)
Remarques sur Java GC
À propos de la gestion de Null
Erreur de virgule flottante Java
À propos des instances Java
[Java] Utilisation de Mirage-Basic de SQL
[Java] Compréhension débutante de Servlet-②
[Java11] Résumé du flux -Avantages du flux-
Principes de base de l'utilisation des caractères (Java)
(Remarque) Classes / variables / méthodes Java
[Java] Création d'annotations originales
java learning day 4
Java fin du mois plusMonths
[Java] À propos de la gestion des exceptions try-catch
[Java] Résumé des expressions régulières
[Java] Résumé des opérateurs (opérateur)
[Java] Implémentation du réseau Faistel
[Java] Comparateur de la classe Collection
[Java] Utilisez correctement Big Decimal ~ 2018 ~
Résumé des bases du langage Java