Comment puis-je aller d'un double à 5 décimales, sans utiliser décimalformat code>? p>
8 Réponses :
Si vous allez bien avec des bibliothèques externes, vous pouvez consulter microfloat , Plus précisément Microdouble. Tostring (double d, longueur int tout) . p>
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;
-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 code> à cinq décimales, et c'est le meilleur que vous allez obtenir. Évidemment, vous ne devez pas réellement utiliser un
double code> si vous représentez des valeurs décimales, mais ce n'était pas la question.
Remarque: Bien que MAI B> 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 code> -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 code>. Si vous souhaitez des calculs décimaux exacts, vous ne devriez pas utiliser
double code>. 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 i>
Math.Round () Code> n'est pas disponible dans J2ME.
Quoi que vous fassiez, si vous vous retrouvez avec une valeur de Si vous vraiment em> voulez des valeurs décimales exactes, vous devez utiliser double code>, il est peu probable qu'il soit exactement em> 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 em> à la valeur d'origine arrondie à 5 décimales". Si vous deviez imprimer la valeur exacte em> de ce double, il aurait probablement plus de 5 décimales. P>
bigdecimal code>. p>
Quoi que vous fassiez, vous ne pouvez pas utiliser bigdecimal code> dans Java Me - car il n'y a pas de telle chose - ni dans CLDC NOR dans Profils CDC
public static double roundNumber(double num, int dec) { return Math.round(num*Math.pow(10,dec))/Math.pow(10,dec); }
multiplier par 100000. Ajouter 0.5. Tronquer entier. Puis diviser par 100000.
code: p>
Essayez le suivant
double value = valueOf(format(US, "%1$.5f", 5.56585258));
DecimalFormat roundFormatter = new DecimalFormat("########0.00000"); public Double round(Double d) { return Double.parseDouble(roundFormatter.format(d)); }
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);
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 i> double à un nombre donné de lieux décimal i>, sauf dans quelques cas spéciaux.
@ Michael: pas de décimalformat en Javame