web-dev-qa-db-fra.com

arrondir à 2 décimales près en java?

J'ai lu beaucoup de questions stackoverflow mais aucune ne semble fonctionner pour moi. J'utilise math.round() pour arrondir. c'est le code:

class round{
    public static void main(String args[]){

    double a = 123.13698;
    double roundOff = Math.round(a*100)/100;

    System.out.println(roundOff);
}
}

la sortie que je reçois est: 123 mais je veux que ce soit 123.14. J'ai lu que l'ajout de *100/100 serait utile, mais comme vous pouvez le constater, je n'ai pas réussi à le faire fonctionner.

il est absolument essentiel que les entrées et les sorties soient un double.

ce serait très utile si vous modifiez la ligne 4 du code ci-dessus et si vous la postez.

165
Aayush Mahajan

bien celui-ci fonctionne ...

double roundOff = Math.round(a * 100.0) / 100.0;

La sortie est

123.14

Ou comme @Rufein a dit

 double roundOff = (double) Math.round(a * 100) / 100;

cela le fera pour vous aussi.

374
SiB
     double d = 2.34568;
     DecimalFormat f = new DecimalFormat("##.00");
     System.out.println(f.format(d));
79
amitchhajer
String roundOffTo2DecPlaces(float val)
{
    return String.format("%.2f", val);
}
46
Arun
BigDecimal a = new BigDecimal("123.13698");
BigDecimal roundOff = a.setScale(2, BigDecimal.ROUND_HALF_EVEN);
System.out.println(roundOff);
43
Reimeus

Retournez dans votre code, remplacez 100 par 100.00 et dites-moi si cela fonctionne. Cependant, si vous voulez être formel, essayez ceci:

import Java.text.DecimalFormat;
DecimalFormat df=new DecimalFormat("0.00");
String formate = df.format(value); 
double finalValue = (Double)df.parse(formate) ;
13
cybertextron

Essayez:

class round{
public static void main(String args[]){

double a = 123.13698;
double roundOff = Math.round(a*100)/100;
String.format("%.3f", roundOff); //%.3f defines decimal precision you want
System.out.println(roundOff);   }}
8
Shyamkkhadka

Je sais que cette question remonte à 2 ans, mais comme chaque corps est confronté à un problème pour arrondir les valeurs à un moment donné. Je voudrais partager une manière différente qui peut nous donner des valeurs arrondies à n’importe quelle échelle en utilisant BigDecimal class .Here we peut éviter les étapes supplémentaires nécessaires pour obtenir la valeur finale si nous utilisons DecimalFormat("0.00") ou si nous utilisons Math.round(a * 100) / 100.

import Java.math.BigDecimal;

public class RoundingNumbers {
    public static void main(String args[]){
        double number = 123.13698;
        int decimalsToConsider = 2;
        BigDecimal bigDecimal = new BigDecimal(number);
        BigDecimal roundedWithScale = bigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("Rounded value with setting scale = "+roundedWithScale);

        bigDecimal = new BigDecimal(number);
        BigDecimal roundedValueWithDivideLogic = bigDecimal.divide(BigDecimal.ONE,decimalsToConsider,BigDecimal.ROUND_HALF_UP);
        System.out.println("Rounded value with Dividing by one = "+roundedValueWithDivideLogic);

    }
}

Ce programme nous donnerait en dessous de la sortie

Rounded value with setting scale = 123.14
Rounded value with Dividing by one = 123.14
8
Shirishkumar Bari
double roundOff = Math.round(a*100)/100;

devrait être

double roundOff = Math.round(a*100)/100D;

L'ajout de 'D' à 100 le rend littéral double, le résultat sera donc précis

8
Arun

Ceci est long mais une solution complète, n'échoue jamais

Donnez simplement votre numéro à cette fonction en tant que double, cela vous ramènera à la valeur décimale arrondie à la valeur la plus proche de 5;

si 4.25, sortie 4.25

si 4.20, sortie 4.20

si 4.24, sortie 4.20

si 4.26, sortie 4.30

si vous voulez arrondir à 2 décimales, utilisez

DecimalFormat df = new DecimalFormat("#.##");
roundToMultipleOfFive(Double.valueOf(df.format(number)));

si jusqu'à 3 places, nouveau DecimalFormat ("#. ###")

si jusqu'à n places, nouveau DecimalFormat ("# .nTimes #")

 public double roundToMultipleOfFive(double x)
            {

                x=input.nextDouble();
                String str=String.valueOf(x);
                int pos=0;
                for(int i=0;i<str.length();i++)
                {
                    if(str.charAt(i)=='.')
                    {
                        pos=i;
                        break;
                    }
                }

                int after=Integer.parseInt(str.substring(pos+1,str.length()));
                int Q=after/5;
                int R =after%5;

                if((Q%2)==0)
                {
                    after=after-R;
                }
                else
                {
                   if(5-R==5)
                   {
                     after=after;
                   }
                   else after=after+(5-R);
                }

                       return Double.parseDouble(str.substring(0,pos+1).concat(String.valueOf(after))));

            }
5
user1023

semble être frappé par l’arithmétique entière: dans certaines langues (int)/(int) sera toujours évaluée en tant qu’arithmétique entière. pour forcer l'arithmétique en virgule flottante, assurez-vous qu'au moins un des opérandes est non entier:

double roundOff = Math.round(a*100)/100.f;
3
umläute

Je viens de modifier votre code. Cela fonctionne bien dans mon système. Voir si cela aide

class round{
    public static void main(String args[]){

    double a = 123.13698;
    double roundOff = Math.round(a*100)/100.00;

    System.out.println(roundOff);
}
}
1
afrin216