Konvertieren Sie Double in String und entfernen Sie Dezimalstellen

1. Einleitung

In diesem Tutorial werden die verschiedenen Möglichkeiten zum Konvertieren eines Doppelwerts in einen String unter Entfernen der Dezimalstellen erläutert.

Wir werden uns ansehen, wie es geht, wenn wir nur den Dezimalteil abschneiden und ihn runden wollen.

2. Abschneiden mit Casting

Wenn unser doppelter Wert innerhalb des int- Bereichs liegt, können wir ihn in einen int umwandeln . Der Cast schneidet den Dezimalteil ab, was bedeutet, dass er abgeschnitten wird, ohne dass eine Rundung vorgenommen wird.

Dieser Ansatz ist ungefähr zehnmal so schnell wie die anderen Ansätze, die wir uns ansehen werden.

Sobald es ein int ist, können wir es an die valueOf- Methode in der String- Klasse übergeben :

String truncated = String.valueOf((int) doubleValue);

Wir können diesen Ansatz sicher anwenden, wenn wir garantiert sind, dass der doppelte Wert im Bereich eines int liegt . Aber wenn unser Wert diesen Wert überschreitet, funktioniert das Casting nicht so, wie wir es möchten .

3. Runden mit String.format ()

Jetzt sind die verbleibenden Ansätze nicht so begrenzt wie das Casting, aber sie haben ihre eigenen Nuancen.

Ein anderer Ansatz besteht beispielsweise darin, die Formatmethode der String- Klasse zu verwenden. Der erste Parameter der Methode gibt an, dass ein Gleitkommawert mit Nullstellen nach dem Dezimalpunkt formatiert wird:

String rounded = String.format("%.0f", doubleValue);

Die Format - Methode verwendet HALF_UP Rundung , die , wenn der Wert nach dem Bruchteil wird aufgerundet ist .5 oder darüber. Andernfalls wird die Zahl vor dem Dezimalpunkt zurückgegeben.

String.format ist zwar einfach, aber der langsamste Weg, dies zu tun .

4. Verwenden von NumberFormat.format ()

Die NumberFormat- Klasse bietet auch eine Formatierungsmethode ähnlich der String- Klasse, aber NumberFormat ist schneller und damit können wir den Rundungsmodus angeben, um entweder Kürzung oder Rundung zu erreichen.

Die Methode setMaximumFractionDigits () teilt dem Formatierer mit, wie viele Bruchstellen nach dem Dezimalpunkt in die Ausgabe aufgenommen werden sollen:

NumberFormat nf = NumberFormat.getNumberInstance(); nf.setMaximumFractionDigits(0); String rounded = nf.format(doubleValue);

Merkwürdigerweise Number verwendet nicht HALF_UP standardmäßig. Stattdessen wird standardmäßig die HALF_EVEN- Rundung verwendet, dh, es wird wie normal gerundet, außer bei 0,5. In diesem Fall wird die nächste gerade Zahl ausgewählt .

Während HALF_EVEN bei der statistischen Analyse hilfreich ist, verwenden wir HALF_UP , um konsistent zu sein:

nf.setRoundingMode(RoundingMode.HALF_UP); String rounded = nf.format(doubleValue);

Und wir können dies ändern und eine Kürzung erzielen, indem wir den Formatierer so einstellen , dass stattdessen der Rundungsmodus FLOOR verwendet wird:

nf.setRoundingMode(RoundingMode.FLOOR); String truncated = nf.format(doubleValue)

Und jetzt wird es abgeschnitten anstatt rund.

5. Verwenden von DecimalFormat.format ()

Ähnlich wie bei NumberFormat kann die DecimalFormat- Klasse zum Formatieren von Doppelwerten verwendet werden. Anstatt das Ausgabeformat mit Methodenaufrufen festzulegen, können wir dem Formatierer jedoch mitteilen, welche Ausgabe wir möchten, indem wir dem Konstruktor ein bestimmtes Muster bereitstellen:

DecimalFormat df = new DecimalFormat("#,###"); df.setRoundingMode(RoundingMode.HALF_UP); String rounded = df.format(doubleValue);

Das Muster "#, ###" bedeutet, dass der Formatierer nur den ganzzahligen Teil der Eingabe zurückgeben soll. Es signalisiert auch, dass die Ziffern durch Komma getrennt in drei Gruppen gruppiert werden sollen.

Hier gelten die gleichen Rundungsstandards. Wenn wir also einen abgeschnittenen Wert ausgeben möchten, können Sie den Rundungsmodus auf FLOOR setzen :

df.setRoundingMode(RoundingMode.FLOOR); String truncated = df.format(doubleValue)

6. Verwenden von BigDecimal.toString ()

Der letzte Ansatz, den wir uns ansehen werden, ist BigDecimal , den wir einbeziehen werden, da er NumberFormat und DecimalFormat für größere Double- s übertrifft .

Wir können verwenden BigDecimal ‚s setScale Methode sagen , ob wir zu rund oder gestutzt werden sollen:

double largeDouble = 345_345_345_345.56; BigDecimal big = new BigDecimal(largeDouble); big = big.setScale(0, RoundingMode.HALF_UP);

Denken Sie daran, dass BigDecimal s unveränderlich sind. Daher müssen wir wie Strings den Wert zurücksetzen.

Und dann nennen wir BigDecimal 's toString :

String rounded = big.toString();

7. Fazit

In diesem Tutorial haben wir uns die verschiedenen Möglichkeiten angesehen, wie wir ein Double in einen String konvertieren können, während wir Dezimalstellen entfernen. Wir haben Ansätze bereitgestellt, die entweder gerundete oder abgeschnittene Werte ausgeben.

Wie üblich sind die Beispiele und Benchmarks auf GitHub verfügbar.