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