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
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|