Informationen zum Standardverhalten der Bruchrundung mit java.text.NumberFormat

Ich werde das Standardverhalten einführen, wenn der Dezimalpunkt mit java.text.NumberFormat gerundet wird und wie das Standardverhalten geändert wird.

JDK-Version

$ 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)

Standardverhalten

Sie können den Dezimalpunkt runden, indem Sie in der Methode "setMaximumFractionDigits" von "NumberFormat" "0" angeben.

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); //Setzen Sie die maximale Anzahl von Nachkommastellen auf 0
		System.out.println(numberFormat.format(98.5));
		System.out.println(numberFormat.format(99.5));
	}

}

Wenn ich diesen Code ausführe ...

98
100

Wird sein. Oh? ?? ?? Vielleicht haben einige Leute das gedacht. Intuitiv ...

98
99

Oder

99
100

Ich hoffe, dass es ... Und ... Dieses Verhalten wird von NumberFormat (RoundingMode) verwaltet (https://docs.oracle.com/javase/jp/8/docs/api/java/math/RoundingMode) Dies liegt daran, dass der Standardwert von .html) "HALF_EVEN" ist. Beim JavaDoc von HALF_EVEN handelt es sich um einen Rundungsmodus, der auf die" nächste Zahl "rundet (wenn jedoch die Zahlen auf beiden Seiten gleich weit entfernt sind, wird er auf die gerade Seite gerundet). Daher wurde "98,5" auf "98" (gerade) anstelle von "99" (ungerade) und "99,5" auf "100" (gerade) anstelle von "99" (ungerade) gerundet.

Ändern Sie den Rundungsmodus

Der "RoundingMode" von "NumberFormat" kann mit der "setRoundingMode" -Methode geändert werden.

@Test
public void testForRoundingModeIsDown() {
	NumberFormat numberFormat = NumberFormat.getInstance();
	numberFormat.setMaximumFractionDigits(0);
	numberFormat.setRoundingMode(RoundingMode.DOWN); //Rundungsmodus ändern
	System.out.println(numberFormat.format(98.5));
	System.out.println(numberFormat.format(99.5));
}

Wenn ich diesen Code ausführe ...

98
99

Wird sein.

Zusammenfassung

Es fühlt sich an wie. Ich war mir der Tatsache nicht bewusst, dass das Standardverhalten "HALF_EVEN" ist, aber ich habe gelernt: heat_smile: Übrigens ... Ich habe diesen Eintrag geschrieben ... Thymeleaf Issue (gh- " 581). Wenn Sie Thymeleaf zum Runden verwenden, erhalten Sie möglicherweise unerwartete Ergebnisse (auf einen Blick gab es keine Möglichkeit, den "Rundungsmodus" zu ändern).

Recommended Posts

Informationen zum Standardverhalten der Bruchrundung mit java.text.NumberFormat
Über das Verhalten von Ruby Hash # ==
Informationen zur Beschreibung von Docker-compose.yml
Zählen Sie die Anzahl der Stellen nach dem Dezimalpunkt in Java
Die Falle, die die Standardimplementierung der Java 8-Schnittstelle mit sich bringt
Verhalten von Files.copy (pathA, pathB) zum Zeitpunkt des Fehlers
Teilen Sie die Zeichenfolge beginnend mit dem Dezimalpunkt (mit index.Of, Teilzeichenfolge).
Über die Grundlagen der Android-Entwicklung
[Hinweis] Behandlung von Java-Dezimalstellen
Denken Sie an die 7 Regeln von Optional
Informationen zur Protokollebene von java.util.logging.Logger
Versuchen Sie, || anstelle des ternären Operators zu verwenden
Was ist ein Test? ・ Über die Wichtigkeit eines Tests
Informationen zur Funktionsweise von next () und nextLine ()
Informationen zur ersten Anzeige von Spring Framework
Über die Behandlung von BigDecimal (mit Reflexion)
Unerwartetes Verhalten der Standardnachricht in org.springframework.context.MessageSource.getMessage ()
Über die Anzahl der Threads von Completable Future
Untersuchen Sie das Verhalten des JPA-Transaktionszeitlimits
[Java] [Spring] Testen Sie das Verhalten des Loggers
Bis zum Start eines Docker-Containers, der mit RedHat Quarkus erstellt wurde