10
votes

Arrondir un double à 5 décimales à Java Me

Comment puis-je aller d'un double à 5 décimales, sans utiliser décimalformat ?


2 commentaires

Pourquoi voudriez-vous éviter la classe qui existe exactement pour ce travail? Et si vous voulez que le résultat soit un double, vous demandez essentiellement quelque chose d'impossible. Vous ne pouvez tout simplement pas arrondir un binaire double à un nombre donné de lieux décimal , sauf dans quelques cas spéciaux.


@ Michael: pas de décimalformat en Javame


8 Réponses :


3
votes

Si vous allez bien avec des bibliothèques externes, vous pouvez consulter microfloat , Plus précisément Microdouble. Tostring (double d, longueur int tout) .


0 commentaires

14
votes

Vous pouvez tourner à la cinquième décimale en le faisant le premier décimal en multipliant votre nombre. Ensuite, faites-en arrondi normal et faites-le à nouveau la cinquième décimale.

Disons que la valeur à arrondir est un double code> nommé x code>: p>

double factor = 1e5; // = 1 * 10^5 = 100000.
double result = Math.round(x * factor) / factor;


5 commentaires

-1: Je ne peux pas croire que cela a été éluté beaucoup, car cela ne fait pas vraiment arrondir le tout. Voir la réponse de Jon pour pourquoi.


Je ne vois pas le problème. Il a été demandé comment ronder un double à cinq décimales, et c'est le meilleur que vous allez obtenir. Évidemment, vous ne devez pas réellement utiliser un double si vous représentez des valeurs décimales, mais ce n'était pas la question.


Remarque: Bien que MAI limite les chiffres à 5 chiffres, il ne peut pas être certain d'être correct, car il n'a aucun moyen d'assurer que la valeur entière math.round (x * facteur) < / Code> peut être représenté dans facteur -ths, ou qu'il sera limité à la valeur d'exposition des lieux (c'est-à-dire 5 places de la partie fractionnée). Pour plus d'informations Théorie et pratique Java: Où est votre point? (Erreurs d'arrondi) et Ce que chaque scientifique devrait savoir sur la flottante Point arithmétique


@mctylr: Vous avez raison sur la correction de bien sûr, mais comme je l'ai déjà dit, c'est la meilleure façon que vous allez obtenir avec double . Si vous souhaitez des calculs décimaux exacts, vous ne devriez pas utiliser double . Les calculs de points flottants binaires sont utilisés pour des cas tels que des calculs scientifiques où toutes vos valeurs sont intrinsèquement inexactes et, dans cette situation, une certaine arrondi approximative à 5 décimales, par exemple à des fins d'affichage, est parfaitement fine


Math.Round () n'est pas disponible dans J2ME.



10
votes

Quoi que vous fassiez, si vous vous retrouvez avec une valeur de double , il est peu probable qu'il soit exactement 5 décimales. Ce n'est tout simplement pas la façon dont les œuvres arithmétiques ponctuelles flottantes binaires. Le meilleur que vous ferez est de "la double valeur la plus proche à la valeur d'origine arrondie à 5 décimales". Si vous deviez imprimer la valeur exacte de ce double, il aurait probablement plus de 5 décimales.

Si vous vraiment voulez des valeurs décimales exactes, vous devez utiliser bigdecimal .


1 commentaires

Quoi que vous fassiez, vous ne pouvez pas utiliser bigdecimal dans Java Me - car il n'y a pas de telle chose - ni dans CLDC NOR dans Profils CDC



1
votes
public static double roundNumber(double num, int dec) {
        return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
}

0 commentaires

8
votes

multiplier par 100000. Ajouter 0.5. Tronquer entier. Puis diviser par 100000.

code: xxx


0 commentaires

2
votes

Essayez le suivant

double value = valueOf(format(US, "%1$.5f", 5.56585258));


0 commentaires

2
votes
DecimalFormat roundFormatter = new DecimalFormat("########0.00000");

public Double round(Double d)
    {
        return Double.parseDouble(roundFormatter.format(d));
    }

0 commentaires

0
votes

J'ai trébuché ici à la recherche d'un moyen de limiter mon numéro de double numéro à deux décimales, alors ne pas tronquer ni l'arrondir. Math.Trunate vous donne la partie intégrante du double nombre et vous débarrassera tout après le point décimal, donc 10.123456 devient 10 après la troncature. Maths.Round arrondit le nombre à la valeur intégrale la plus proche de sorte que 10,65 devient 11 tandis que 10,45 deviennent 10. Donc, ces deux fonctions ne répondaient pas à mes besoins (je souhaite que .NET avait surchargé ces deux pour permettre de tronquer ou d'arrondir à une certaine nombre de décimales). Le moyen le plus simple de faire ce dont j'avais besoin est de:

//First create a random number 
Random rand = new Random();

//Then make it a double by getting the NextDouble (this gives you a value 
//between 0 and 1 so I add 10 to make it a number between 10 and 11
double chn = 10 + rand.NextDouble();

//Now convert this number to string fixed to two decimal places by using the
//Format "F2" in ToString
string strChannel = chn.ToString("F2");

//See the string in Output window
System.Diagnostics.Debug.WriteLine("Channel Added: " + strChannel);

//Now convert the string back to double so you have the double (chn) 
//restricted to two decimal places
chn = double.Parse(strChannel);


0 commentaires