Een getal afronden naar N decimalen in Java

1. Overzicht

In dit korte artikel gaan we bekijken hoe je een getal naar kunt afronden n decimalen in Java.

2. Decimale getallen in Java

Java biedt twee primitieve typen die kunnen worden gebruikt voor het opslaan van decimale getallen: vlotter en dubbele. Dubbele is het type dat standaard wordt gebruikt:

dubbele PI = 3,1415;

Beide typen mag nooit worden gebruikt voor precieze waarden, zoals valuta's. Daarvoor, en ook voor afronding, kunnen we de BigDecimal klasse.

3. Een decimaal getal opmaken

Als we alleen een decimaal getal willen afdrukken met n cijfers achter de komma, we kunnen de output String eenvoudig opmaken:

System.out.printf ("Waarde met 3 cijfers achter de komma% .3f% n", PI); // OUTPUTS: waarde met 3 cijfers achter de komma 3.142

Als alternatief kunnen we de waarde opmaken met de DecimalFormat klasse:

DecimalFormat df = nieuw DecimalFormat ("###. ###"); System.out.println (df.format (PI));

DecimalFormat stelt ons in staat om afrondingsgedrag expliciet in te stellen, waardoor we meer controle hebben over de output dan String.format () hierboven gebruikt.

4. Afronding Dubbeles Met BigDecimal

Om af te ronden dubbeles naar n decimalen, kunnen we een helper methode:

privé statische dubbele ronde (dubbele waarde, int plaatsen) {if (plaatsen <0) werpen nieuwe IllegalArgumentException (); BigDecimal bd = nieuwe BigDecimal (Double.toString (waarde)); bd = bd.setScale (plaatsen, RoundingMode.HALF_UP); terug bd.doubleValue (); }

Er is een belangrijk ding om op te merken in deze oplossing - bij het construeren BigDecimal; wij moeten altijd gebruiken BigDecimal (tekenreeks) constructeur. Dit voorkomt problemen met het weergeven van onnauwkeurige waarden.

We kunnen hetzelfde bereiken door de Apache Commons Math-bibliotheek te gebruiken:

 org.apache.commons commons-math3 3.5 

De laatste versie vind je hier.

Zodra de bibliotheek aan het project is toegevoegd, kunnen we de Precision.round () methode, die twee argumenten nodig heeft - waarde en schaal:

Precision.round (PI, 3);

Standaard gebruikt het hetzelfde HALF_UP afrondingsmethode als onze hulpmethode. Daarom zouden de resultaten hetzelfde moeten zijn.

Merk op dat we het afrondingsgedrag kunnen veranderen door de gewenste afrondingsmethode als derde parameter door te geven.

5. Dubbel afronden met DoubleRounder

DoubleRounder is een hulpprogramma in de decimal4j-bibliotheek. Het biedt een snelle en afvalvrije methode voor het afronden van dubbels van 0 tot 18 decimalen.

We kunnen de bibliotheek ophalen (de laatste versie is hier te vinden) door de afhankelijkheid toe te voegen aan het pom.xml:

 org.decimal4j decimal4j 1.0.3 

Nu kunnen we eenvoudig gebruiken:

DoubleRounder.round (PI, 3);

Echter, DoubleRounder mislukt in een paar scenario's, bijvoorbeeld:

System.out.println (DoubleRounder.round (256.025d, 2)); // OUTPUTS: 256.02 in plaats van 256.03

6. Math.round () methode

Een andere manier om getallen af ​​te ronden, is door de methode Math.Round () te gebruiken.

In dit geval hebben we controle n aantal decimalen door te vermenigvuldigen en te delen door 10 ^ n:

openbare statische dubbele roundAvoid (dubbele waarde, int plaatsen) {dubbele schaal = Math.pow (10, plaatsen); retourneer Math.round (waarde * schaal) / schaal; }

Deze methode wordt niet aanbevolen omdat het de waarde afkapt. In veel gevallen worden waarden onjuist afgerond:

System.out.println (roundAvoid (1000.0d, 17)); // UITGANGEN: 92.23372036854776 !! System.out.println (roundAvoid (260.775d, 2)); // OUTPUTS: 260.77 in plaats van de verwachte 260.78

En dus wordt deze methode hier alleen vermeld voor leerdoeleinden.

7. Conclusie

In deze korte tutorial hebben we verschillende technieken behandeld voor het afronden van getallen naar n decimalen.

We kunnen de uitvoer eenvoudig opmaken zonder de waarde te wijzigen, of we kunnen de variabele afronden met behulp van een hulpmethode. We hebben ook een aantal bibliotheken behandeld die met dit probleem te maken hebben.

De code die tijdens de discussie is gebruikt, is te vinden op GitHub.


$config[zx-auto] not found$config[zx-overlay] not found