[JAVA] Comment utiliser Big Decimal

J'écrivais un code qui gère les fractions, et j'y suis entré de différentes manières, donc un mémo à ce moment-là.

Qu'est-il arrivé

J'avais besoin de diviser une valeur fractionnaire, j'ai donc écrit le code à diviser en utilisant BigDecimal comme suit.

public class Divide {
	public static void main(String[] args) {
		BigDecimal num1 = new BigDecimal(1.1);
		BigDecimal num2 = new BigDecimal(100);

		System.out.println(num1.divide(num2));
	}
}

Puisqu'il est de 1,1 ÷ 100, le résultat devrait être 0,011, mais lorsque j'essaie de l'exécuter, il génère "0.01100000000000000088817841970012523233890533447265625". Je me suis demandé pourquoi, mais cela n'a pas été utilisé correctement.

Que se passait-il

J'ai pris 1.1 comme argument lors de la génération de BigDecimal, mais il semble que cela contienne déjà une erreur. Étant donné que les fractions décimales sont représentées par des fractions binaires, certaines valeurs ne peuvent pas être exprimées en premier lieu. Si vous y réfléchissez, c'est naturel. .. .. Puisque 1.1 est une valeur qui ne peut pas être exprimée, si BigDecimal est généré en fonction de celle-ci, l'erreur sera conservée.

Que devrais-je faire

Évitez d'utiliser des valeurs doubles et flottantes comme indiqué ci-dessous.

public class Divide {
	public static void main(String[] args) {
		BigDecimal num1 = new BigDecimal("1.1");
		BigDecimal num2 = new BigDecimal("100");

		System.out.println(num1.divide(num2));
	}
}

Cela vous donnera un calcul précis. Alors, BigDecimal a-t-il besoin d'un constructeur qui prend le double comme argument?

Montage supplémentaire

ArithmeticException se produit lors du calcul d'une valeur indivisible comme indiqué ci-dessous.

public class Divide {
	public static void main(String[] args) {
		BigDecimal num1 = new BigDecimal("1.1");
		BigDecimal num2 = new BigDecimal("3");

		System.out.println(num1.divide(num2));
	}
}

La méthode de division de BigDecimal semble soulever une exception si elle n'est pas divisible par défaut. Par conséquent, spécifiez le nombre de chiffres et la méthode d'arrondi comme indiqué ci-dessous.

public class Divide {
	public static void main(String[] args) {
		BigDecimal num1 = new BigDecimal("1.1");
		BigDecimal num2 = new BigDecimal("3");

		System.out.println(num1.divide(num2,2,RoundingMode.FLOOR));
	}
}

Recommended Posts

Comment utiliser Big Decimal
Comment utiliser Map
Comment utiliser rbenv
Comment utiliser with_option
Comment utiliser fields_for
Comment utiliser java.util.logging
Comment utiliser la carte
Comment utiliser collection_select
Comment utiliser Twitter4J
Comment utiliser active_hash! !!
Comment utiliser MapStruct
Comment utiliser TreeSet
[Comment utiliser l'étiquette]
Comment utiliser l'identité
Comment utiliser le hachage
Comment utiliser Dozer.mapper
Comment utiliser Gradle
Comment utiliser org.immutables
Comment utiliser java.util.stream.Collector
Comment utiliser VisualVM
Comment utiliser Map
Comment utiliser l'API Chain
[Java] Comment utiliser Map
Comment utiliser Queue avec priorité
[Rails] Comment utiliser enum
Comment utiliser java Facultatif
Comment utiliser le retour Ruby
[Rails] Comment utiliser enum
Comment utiliser @Builder (Lombok)
Comment utiliser la classe Java
[Java] Comment utiliser removeAll ()
Comment utiliser String [] args
Comment utiliser la jonction de rails
Comment utiliser Java Map
[Java] Utilisez correctement Big Decimal ~ 2018 ~
Ruby: Comment utiliser les cookies
Comment utiliser Dependant :: Destroy
Comment utiliser Eclipse Debug_Shell
Comment utiliser Apache POI
[Rails] Comment utiliser la validation
Comment utiliser les variables Java
[Rails] Comment utiliser authenticate_user!
Comment utiliser GC Viewer
Comment utiliser Lombok maintenant
[Création] Comment utiliser JUnit
[Rails] Comment utiliser Scope
Comment utiliser la méthode link_to
[Rails] Comment utiliser la "devise" des gemmes
Comment utiliser Lombok au printemps
Comment utiliser StringBurrer et Arrays.toString.
Comment utiliser le tableau (mémorandum personnel)
Comment utiliser HttpClient de Java (Get)