1369 votes

Comment arrondir un nombre à n chiffres après la virgule dans Java

Ce que j'aimerais c'est une méthode pour convertir un double en une chaîne qui arrondit à l'aide de demi-méthode. I. e. si la décimale arrondie à 5, on arrondit toujours le numéro précédent. C'est la méthode standard de l'arrondissement la plupart des gens s'attendre dans la plupart des situations.

Je voudrais aussi uniquement de chiffres significatifs pour être affiché. Qui est il ne devrait pas y avoir des zéros à la fin.

Je connais une méthode de le faire est d'utiliser la Chaîne de caractères.méthode de mise en forme:

String.format("%.5g%n", 0.912385);

retourne:

0.91239

ce qui est génial, mais il affiche toujours les nombres avec décimales 5, même si elles ne sont pas significatives:

String.format("%.5g%n", 0.912300);

retourne:

0.91230

Une autre méthode consiste à utiliser le DecimalFormatter:

DecimalFormat df = new DecimalFormat("#.#####");
df.format(0.912385);

retourne:

0.91238

Cependant, comme vous pouvez le voir, cette utilise des demi-même arrondissement. Qu'en est-il arrondir à la baisse si le chiffre est pair. Ce que j'aimerais c'est ceci:

0.912385 -> 0.91239
0.912300 -> 0.9123

Quelle est la meilleure façon de le réaliser en Java?

826voto

curtisk Points 8623

Utiliser setRoundingMode, voir Javadoc, définissez l' RoundingMode explicitement pour traiter votre problème avec le demi-même round, puis utilisez le modèle de format pour votre sortie requise.

495voto

asterite Points 3218

En supposant value est double, vous pouvez le faire:

(double)Math.round(value * 100000) / 100000

C'est pour les 5 chiffres de précision. Le nombre de zéros indiquent le nombre de décimales.

202voto

MetroidFan2002 Points 11413
new BigDecimal(String.valueOf(double)).setScale(yourScale, BigDecimal.ROUND_HALF_UP);

vous obtiendrez un BigDecimal. Pour obtenir la chaîne de caractères en dehors de ça, il suffit d'appeler qu' BigDecimals' toString méthode, ou l' toPlainString méthode pour Java 5+ pour une simple chaîne de format.

124voto

Milhous Points 6362

Vous pouvez également utiliser l'

DecimalFormat df = new DecimalFormat("#.00000");
df.format(0.912385);

pour assurez-vous d'avoir le dernier 0.

93voto

EJP Points 113412

Comme certains l'ont noté, la bonne réponse est à utiliser soit en DecimalFormat ou BigDecimal. Floating-point de ne pas avoir de décimales de sorte que vous ne peut pas rond/truncate à un certain nombre d'entre eux dans la première place. Vous avez à travailler dans un décimal radix, et c'est ce que ces deux classes.

J'ai écris le code suivant comme un contre-exemple pour toutes les réponses dans ce fil et, de fait, tous sur StackOverflow (et d'ailleurs) qui recommandent de multiplication suivie par la troncature suivi par la division. Il revient sur les défenseurs de cette technique, pour expliquer pourquoi le code suivant donne la mauvaise sortie dans plus de 92% des cas.

public class RoundingCounterExample
{

    static float roundOff(float x, int position)
    {
        float a = x;
        double temp = Math.pow(10.0, position);
        a *= temp;
        a = Math.round(a);
        return (a / (float)temp);
    }

    public static void main(String[] args)
    {
        float a = roundOff(0.0009434f,3);
        System.out.println("a="+a+" (a % .001)="+(a % 0.001));
        int count = 0, errors = 0;
        for (double x = 0.0; x < 1; x += 0.0001)
        {
            count++;
            double d = x;
            int scale = 2;
            double factor = Math.pow(10, scale);
            d = Math.round(d * factor) / factor;
            if ((d % 0.01) != 0.0)
            {
                System.out.println(d + " " + (d % 0.01));
                errors++;
            }
        }
        System.out.println(count + " trials " + errors + " errors");
    }
}

La sortie de ce programme:

10001 trials 9251 errors

EDIT: je remarque que ce post a été ici pendant près de six mois et pas d'explications ont été à venir. Tirer vos propres conclusions.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X