Accueil > Forum > > > > Arrondi à n chiffres significatifs
Arrondi à n chiffres significatifs
dimanche 19 novembre 2006 à 00:18:23 |
Arrondi à n chiffres significatifs

juancho2786
|
Bonsoir , je fais une méthode qui permet d'arrondir à n chiffres significatis seulement j'ai un problème. Par exemple lorsque le nombre à arrondir est 0.000023678 et j'aimerais l'arrondire à 3 chiffres significatifs, cela devrait donné 0.0000237 et pas 2370.0 comme c'est le cas dans ma méthode. Sinon pour le reste ça marche correctement, enfin je pense... Avez vous une idée? merci beaucoup !! voici la code : public static double arrondiNChiffresSignificatifs(double nombre, int n){ char signe; int exposant=0; if(nombre<0)signe='-'; else signe='+'; nombre=Math.abs(nombre); while(nombre<0.1){ nombre*=10; exposant++; } while(nombre>=1){ nombre/=10; exposant++; } nombre=(Math.round(nombre*Math.pow(10,n)))*Math.pow(10,exposant)/(Math.pow(10,n)); if(signe=='-')return -nombre; else return nombre; }
|
|
dimanche 19 novembre 2006 à 03:41:59 |
Re : Arrondi à n chiffres significatifs

abdouinfomiage
|
public double round(double what, int howmuch) {
return (double)( (int)(what * Math.pow(10,howmuch) + .5) ) / Math.pow(10,howmuch);
}
System.out.println(round(1.6666666,2));
System.out.println(round(1.6666666,3));
System.out.println(round(1.6666666,0));Résultats :
}
regarde cet example et bonne chance
|
|
mercredi 9 avril 2008 à 03:17:23 |
Re : Arrondi à n chiffres significatifs

verdy_p
|
abouinfoimage, ta solution est fausse et ne répond pas au problème. Il ne demande pas à arrondir un double sur N décimales, mais à N chiffres significatifs (à priori N < 17 car au delà, il n'y a plus aucun chiffre significatif et plus rien à arrondir dans un double) ; relis sa question, il a été très clair dans son exemple!
Son problème est moins simple qu'il y parait, car il faut faire attention à ne pas déborder en capacité pour des valeurs limites, ce qui peut arriver si on multiplie puis divise.
L'algo doit donc: * trouver k, le logarithme de base 10 (arrondi à l'entier inférieur) du nombre x pour pouvoir le ramener à un intervalle entre 0,1 compris et 1,0 non compris (si on le divisait par 10^k); k est petit (à cause de la capacité maximale des "double", k sera entre -308 et 308 si je me souviens bien, pour les valeurs normales) et tient dans un entier; * en ajoutant à cet entier le nombre de chiffre significatifs demandés N, on a un nombre dans l'intervalle entre 10^(N-1) compris et 10^N non compris afin de prendre l'entier arrondi; attention: pour N=16, 10^16 ne tient pas dans un "int", on doit utiliser Math.floor() (du moins tant que le nombre est positif. * après l'arrondi, il reste à ramener à l'ordre de grandeur d'origine. * on doit compléter en traitant spécialement l'arrondi de 0.0.
Ma solution est donc plutôt: public static double arrondiNChiffresSignificatifs(final double x, final int n){ if (n < 1) throw new BadArgumentException("n < 1"); if (n > 17) return x; if (x == 0) return 0; final double signedScale = x < 0 ? -Math.pow(10, Math.floor(Math.log10(-x)) - n + 1) : Math.pow(10, Math.floor(Math.log10(x)) - n + 1); return Math.floor(x / signedScale + 0.5) * signedScale; }
Note: l'arrondi est sans doute approximatif pour les valeurs dénormales très proches de 0, c'est à dire k <= -308, là où le logarithme de base 10 est aussi approximatif.
|
|
mercredi 9 avril 2008 à 03:28:19 |
Re : Arrondi à n chiffres significatifs

verdy_p
|
pour l'arrondi à l'entier le plus proche j'ai utilisé Math.floor(x+0.5) dans l'instruction return; si tu veux l'arrondi IEEE à l'entier pair le plus proche quand on est juste au milieu de deux entiers, on peut aussi utiliser Math.round(x)... Cela ne change pas énormément les choses. L'autre solution est d'utiliser la conversion via une chaine et un format, puis la conversion inverse, mais c'est bien plus lourd car Java gère le formatage en fonction d'une locale, et effectue des tas d'autres fonctions en interne pour gérer les formateurs de nombres, et réanalyser la chaîne.
|
|
mardi 7 avril 2009 à 16:14:13 |
Re : Arrondi à n chiffres significatifs

DonBanini
|
Whoa, merci (1 ans après....), çà m'as aussi vachement aidé, même si j'ai pas très bien suivit de raisonnement.... :(
|
|
Cette discussion est classée dans : nombre, chiffres, math, exposant, significatifs
Répondre à ce message
Sujets en rapport avec ce message
Comment déterminer nombre de chiffres dans un int [ par Bouki ]
la question est dans le sujetpar exemple si a == 10 ca renvoie 2 et si b == 9 ca renvoie 1
[Math]Manipuler les exposant avec un float [ par djodjoo ]
Salut tous,Voilà mon problème, j'aimerais pouvoir manipuler les nombre tel qque 2.12E-4 par exemple.Ce que j'aimerais pouvoir faire : _
Génération de code à 8 chiffres. [ par fiftyxav03 ]
Bonjour à tous, alors mon problème est le suivant: Je voudrais générer 1 liste de code à 8 chiffres automatiquement; Or j'ai simplement réussi à obte
Limité le nombre de chiffres après la virgule. [ par zinZ ]
Bonjour, J'ai une petite question toute bête mais j'ai beau chercher dans les packages math et lang, je ne trouve rien. J'effectue des calculs (stat
Sortir un zéro avec un Math.random()*10+1 [ par daviddubois ]
Bonjour tout le monde,J'essaie d'avoir des chiffres de 0 à 10 avec un Math.random(), le problème est qu'il sort des chiffres entre 1 et 10.Il ne sort
Probleme avec un tableau de classe [ par Belette32 ]
Bonjour à tous, voila, j'aimerais utiliser une structure appelée Voiture sous forme de tableau.Voici mon code :Public void init(){class Voiture{int no
Layout [ par didoux95 ]
Bonjour à tous.J'ai un petit problème avec les Layout. Je suis en train de construire une fenêtre qui "ajuste" automatiquement le nombre de composants
switch [ par didoux95 ]
Bonjour a tous.Est ce que vous savez qi il existe une fonction similaire a "switch (num)" mais pour n'importe quel nombre.La fonction "switch test un
la fonction Math.random() [ par dorine82 ]
bonjour,j'aimerais savoir comment utiliser deux threads chacun a son tour. si par exemple j' ai le thread A et le thread B , je dois avoir comme resul
probleme avec if else [ par SilverShadow ]
Bonjour j'ai un probleme avec un programme que je suis en train de coder je voudrais que le programme affiche la valeur la plus grande dans un tableau
Livres en rapport
|
Derniers Blogs
DéMARRONS AVEC LES TASKSDéMARRONS AVEC LES TASKS par richardc
Que vous le vouliez ou non, le développement multi-tâche est maintenant une obligation pour toute nouvelle application. Il est donc vital d'en comprendre les mécanismes et de s'y mettre le plus tôt possible.
En attendant le .NET Framework 4.5 avec le...
Cliquez pour lire la suite de l'article par richardc SLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPSSLIDE & DéMO TECHDAYS 2012 - FAST & FURIOUS XAML APPS par Vko
Retrouvez les slides et les démo de ma session Fast & Furious XAML Apps. A ceux qui se posent la question : "est-ce que le code de la DataGrid est disponible?", je vous répondrais "pas encore". Je vais mettre en place un projet codeplex pour part...
Cliquez pour lire la suite de l'article par Vko XNA IS DEAD!XNA IS DEAD! par richardc
Depuis la semaine dernière (et grâce aux TechDays 2012), je me penche activement sur la nouvelle version de Windows, aka Windows 8. Vous me direz, il était temps puisque la première preview date de Septembre dernier.
OK. Remarquez, on n'en est qu'aux...
Cliquez pour lire la suite de l'article par richardc TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 !TECHDAYS PARIS 2012 : WINDOWS SERVER "8" QUOI DE 9 ! par ROMELARD Fabrice
Speakers: Fabrice Meillon et Stanislas Quastana Cette session est basée entièrement sur celle donnée lors de la BUILD cet hiver. Il n'y a pas d'ajout d'information en rapport avec cet évènement passé. Windows 8 Server sera intégralem...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE)[HTML5] AUTOUR DU W3C : NOUVEAUX STANDARDS ET WEB MOBILE (LILLE) par Gio
Je m'y prends un peu tard je sais, mais bon je suis développeur web et donc hyper fainéant ! Toujours dans le cadre des technologies émergentes, ici HTML5, parce qu'on aime HTML5 chez Wyg , nous seront présent, le vieux ( Aurélien V.) et moi, pour pr...
Cliquez pour lire la suite de l'article par Gio
Forum
J2EE OU ASP J2EE OU ASP par ikanD
Cliquez pour lire la suite par ikanD
Logiciels
DocTranslate (V3.1.0.0)DOCTRANSLATE (V3.1.0.0)DocTranslate est un traducteur de document Microsoft Word, PowerPoint et Excel. Il permet d'autom... Cliquez pour télécharger DocTranslate Tribler (2012)TRIBLER (2012)Tribler est un client pair à pair (P2P/Peer-to-Peer) open source avec la capacité de regarder des... Cliquez pour télécharger Tribler OneSwarm (2012)ONESWARM (2012)Le peer-to-peer qui protège votre vie privée, c'est OneSwarm.
Ce logiciel de peer-to-peer crypté... Cliquez pour télécharger OneSwarm PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V8.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System
|