[Hinweis] Behandlung von Java-Dezimalstellen

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)

Umgang mit Dezimalstellen

In Java ist das Auf- und Abrunden von Ganzzahlwerten etwas schwer zu verstehen. (Beim Austausch von Daten mit dem Gleitkomma-Typ vom Integer-Typ <-> ist dies in der Regel sinnlich verwirrend.) Daher halte ich es für sicherer, numerische Werte mit Zeichenfolgen zu behandeln, sodass ich sie als Memorandum als Gegenmaßnahme belasse.

Ich möchte die zweite Ziffer nach dem Dezimalpunkt des ursprünglichen numerischen Werts runden und dann auf einen ganzzahligen Wert zurücksetzen. 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

Bei der Verarbeitung mit java.math.BigDecimal muss die Anzahl der effektiven Ziffern für den einmal zu verarbeitenden numerischen Wert angepasst werden, um innerhalb des Bereichs nach dem Dezimalpunkt aufzurunden, abzurunden, abzurunden usw.

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());

		//Nach dem Dezimalpunkt n+Runden Sie die erste Ziffer ab
		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);

		//Aufrunden / abrunden / abrunden
		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);

		//In int konvertieren
		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);

	}

}

Ausführungsergebnis
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

Bei der Erfassung des numerischen Werts, der als Zeichenfolge behandelt werden soll

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");

		//Nach dem Dezimalpunkt n+Runden Sie die erste Ziffer ab
		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);

		//Aufrunden / abrunden / abrunden
		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);

		//In int konvertieren
		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);

	}

}

Ausführungsergebnis
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

Aus den oben genannten Gründen erfordert BigDecimal bei der Konvertierung in einen Gleitkomma-Ganzzahlwert eine Kinderbetreuung, unabhängig davon, ob es sich um einen Gleitkommatyp oder einen Zeichenfolgentyp handelt.

Für ganzzahligen Typ

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());

		//Nach dem Dezimalpunkt n+Runden Sie die erste Ziffer ab
		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);

		//Aufrunden / abrunden / abrunden
		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);

		//Erhöhen Sie die Ziffern, bevor Sie in int konvertieren
		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);
		
	}

}

Ausführungsergebnis
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

Für Zeichenfolgentyp

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");

		//Nach dem Dezimalpunkt n+Runden Sie die erste Ziffer ab
		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);

		//Aufrunden / abrunden / abrunden
		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);

		//Erhöhen Sie die Ziffern, bevor Sie in int konvertieren
		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);
		
	}

}

Ausführungsergebnis
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

Es scheint besser zu sein, die Anzahl der effektiven Nachkommastellen im Zeichenkettentyp anzupassen, aber am Ende muss es der Ganzzahltyp sein, also werde ich versuchen, eine bessere Methode zu finden.

Beiseite

Wenn Sie nur abrunden möchten, können Sie Math.round verwenden. Wenn Sie jedoch Aufrunden oder Abwerten verwenden möchten, verwenden Sie wahrscheinlich Big Decimal.

test.java


		double d1 = 0.50;
		double d2 = 0.25;		
		System.out.println(Math.round(d1)+":"+Math.round(d2));
Ausführungsergebnis
1:0

Recommended Posts

[Hinweis] Behandlung von Java-Dezimalstellen
Umgang mit Java-Gleitkomma Beim Lesen des Nachschlagewerks [Hinweis]
[Java] Praxis der Ausnahmebehandlung [Ausnahme]
Umgang mit Zeitzonen mit Java
Zählen Sie die Anzahl der Stellen nach dem Dezimalpunkt in Java
Schrittweises Verständnis der Behandlung von Java-Ausnahmen
Grundkenntnisse in der Java-Entwicklung Schreiben von Notizen
Java-Ausnahmebehandlung?
Java Big Decimal
[Java] Ausnahmebehandlung
☾ Java / Ausnahmebehandlung
Informationen zur Behandlung von Java-Ausnahmen
Behandlung von Java-Ausnahmen
[Java] Übersicht über Java
[Java] Behandlung von Java Beans in der Methodenkette
[Hinweis] Java: Messen Sie die Geschwindigkeit der Zeichenfolgenverkettung
[Hinweis] Java: Geschwindigkeit der Verarbeitung der Liste nach Zweck
Abgelaufene Java-Sammlung
Java abstrakter Modifikator [Hinweis]
[Java] Interne Iterator-Hinweise
[Java] Bedeutung der serialVersionUID
Bitte beachten Sie die Aufteilung (Aufteilung) von Java Kotlin Int und Int
NIO.2 Überprüfung von Java
Bewertung von Java Shilber
Java - Vereinigung von Kommentaren
Einfaches Memo von JUnit of Java
[Java] Java SE 8 Silver Note
Geschichte der Java-Annotationen
[Hinweis] Java: Zeichenfolgensuche
[Hinweis] Java: Zeichenkettenübersicht
Java (Verdienste des Polymorphismus)
Meine Studiennotiz (Java)
NIO Bewertung von Java
[Java] Drei Funktionen von Java
Zusammenfassung der Java-Unterstützung 2018
[Java] Umgang mit Zeichenketten (String-Klasse und StringBuilder-Klasse)
Java: Datum hinzufügen [Hinweis]
[java] Nummer ablehnen → Zahl n-Zahl → Dezimalzahl
[Hinweis] Java Ausgabe der Summe von ungeraden und geraden Elementen
Informationen zum Standardverhalten der Bruchrundung mit java.text.NumberFormat
[Einführung in Java] Umgang mit Zeichenfolgen (String-Klasse, StringBuilder-Klasse)
Hinweise zu Java GC
Über den Umgang mit Null
Konfrontieren Sie Java-Gleitkommafehler
Über Java-Instanzen
[Java] Mirage-Basic-Verwendung von SQL
[Java] Anfängerverständnis von Servlet-②
[Java11] Stream-Zusammenfassung - Vorteile von Stream -
Grundlagen der Zeichenoperation (Java)
(Hinweis) Java-Klassen / Variablen / Methoden
[Java] Erstellen von Originalanmerkungen
Java-Lerntag 4
Java Ende des Monats plusMonate
[Java] Informationen zur Behandlung von Try-Catch-Ausnahmen
[Java] Zusammenfassung der regulären Ausdrücke
[Java] Zusammenfassung der Operatoren (Operator)
[Java] Implementierung des Faistel-Netzwerks
[Java] Komparator der Collection-Klasse
[Java] Big Decimal richtig verwenden ~ 2018 ~
Zusammenfassung der Grundlagen der Java-Sprache