À propos du comportement par défaut de l'arrondi des fractions à l'aide de java.text.NumberFormat

J'introduirai le comportement par défaut lors de l'arrondi de la virgule décimale en utilisant java.text.NumberFormat et comment changer le comportement par défaut.

Version JDK

$ java -version
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.121-b13, mixed mode)

Comportement par défaut

Vous pouvez arrondir la virgule décimale en spécifiant «0» dans la méthode «setMaximumFractionDigits» de «NumberFormat».

package com.example;

import java.text.NumberFormat;

import org.junit.Test;

public class NumberFormatTests {

	@Test
	public void testForDefault() {
		NumberFormat numberFormat = NumberFormat.getInstance();
		numberFormat.setMaximumFractionDigits(0); //Définissez le nombre maximum de chiffres de la virgule décimale sur 0
		System.out.println(numberFormat.format(98.5));
		System.out.println(numberFormat.format(99.5));
	}

}

Quand j'exécute ce code ...

98
100

Sera. Oh? ?? ?? Peut-être que certaines personnes ont pensé cela. Intuitivement ...

98
99

Ou

99
100

J'espère que ce sera ... Et ... Ce comportement est géré par NumberFormat [ RoundingMode](https://docs.oracle.com/javase/jp/8/docs/api/java/math/RoundingMode En effet, la valeur par défaut de .html) est «HALF_EVEN». En regardant le JavaDoc de HALF_EVEN, c'est un mode d'arrondi qui arrondit au" nombre le plus proche "(cependant, si les nombres des deux côtés sont des distances égales, il arrondit au côté pair). Par conséquent, «98,5» a été arrondi à «98» (pair) au lieu de «99» (impair), et «99,5» a été arrondi à «100» (pair) au lieu de «99» (impair).

Changer le mode d'arrondi

Le RoundingMode de NumberFormat peut être modifié avec la méthode setRoundingMode.

@Test
public void testForRoundingModeIsDown() {
	NumberFormat numberFormat = NumberFormat.getInstance();
	numberFormat.setMaximumFractionDigits(0);
	numberFormat.setRoundingMode(RoundingMode.DOWN); //Changer le mode d'arrondi
	System.out.println(numberFormat.format(98.5));
	System.out.println(numberFormat.format(99.5));
}

Quand j'exécute ce code ...

98
99

Sera.

Résumé

C'est comme ressentir. Je n'étais pas au courant du fait que le comportement par défaut est HALF_EVEN, mais j'ai appris: sweat_smile: Au fait ... j'ai écrit cette entrée ... Thymeleaf Issue (gh-" 581). Si vous utilisez Thymeleaf pour arrondir, vous pouvez obtenir des résultats inattendus (en un coup d'œil, il n'y avait aucun moyen de changer le RoundingMode).

Recommended Posts

À propos du comportement par défaut de l'arrondi des fractions à l'aide de java.text.NumberFormat
À propos du comportement de ruby Hash # ==
À propos de la description de Docker-compose.yml
Comptez le nombre de chiffres après la virgule décimale en Java
Le piège que l'implémentation par défaut de l'interface Java 8 apporte
Comportement de Files.copy (pathA, pathB) au moment de l'erreur
Divisez la chaîne de caractères à partir du point décimal (en utilisant index.Of, sous-chaîne)
À propos des bases du développement Android
[Note] Gestion des points décimaux Java
Pensez aux 7 règles d'Optionnel
À propos du niveau de journalisation de java.util.logging.Logger
Essayez d'utiliser || au lieu de l'opérateur ternaire
Qu'est-ce qu'un test? ・ À propos de l'importance d'un test
À propos du fonctionnement de next () et nextLine ()
À propos de l'affichage initial de Spring Framework
À propos du traitement de BigDecimal (avec réflexion)
Comportement inattendu du message par défaut dans org.springframework.context.MessageSource.getMessage ()
À propos du nombre de threads de Completable Future
Examiner le comportement du délai d'expiration des transactions JPA
[Java] [Spring] Tester le comportement de l'enregistreur
Jusqu'au lancement d'un conteneur Docker construit avec RedHat Quarkus