Ecriture standard et non scientifique d'un grand nombre

Résolu
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 - 14 janv. 2010 à 15:37
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 - 15 janv. 2010 à 16:27
Bonjour,
Tout simplement je voudrais afficher cette forme-là du nombre que je viens de calculer: 30 414 093 201 713 378 043 612 608 166 064 768 844 377 641 568 960 512 000 000 000 000 et non celle-ci: 3.041E +64!!!

J'ai essayé tout un tas de fonctions et de classe (String.format etc.) mais je n'arrive qu'à "allonger" la partie entière; Je n'arrive pas à obtenir le nombre dans sa totalité...

Voila j'espère que quelqu'un pourra m'aider. Merci d'avance!



moi

12 réponses

tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
15 janv. 2010 à 08:17
Je l'ai un peu dit au message précédent.
Un nombre est un tableau (dimension variable) de chiffres. Tu as appris les mécanismes des opérations de base à l'école primaire.
Avec ça tu peux faire une classe qui réinventerait le nombre.

De plus, rien n'empêche de remplacer le chiffre par un nombre.

Pour gérer de gros entiers (je te laisse imaginer pour les réels!), il faudrait 2 classes
1) Chiffre qui serait par exemple un long.
2) La classe Nombre aurait un tableau de Chiffre (ou une liste, pour gérer la quantité variable) avec des méthodes d'affectation/restitution et d'opérations

+ : il suffit d'additionner chaque élément de même index en commençant à 0 (index du Chiffre de droite). Si l'addition donne une valeur supérieure à un nombre que tu choisis comme maximum, c'est une retenue à additionner aux valeurs de l'index suivant.

- : idem, facile.

* : comme en primaire, tu poses ton opération, en remplaçant ce que tu faisais avec chaque chiffre par la même opération sur des nombre (mes "Chiffre"s). C'est plus long à coder que +, mais pas plus difficile.

/ : je n'ai pas en tête mais je ferai comme pour *

Là où ça se corse, comme le signalait Krimog, c'est pour les fonctions mathématiques traditionnelles comme trigo, puissance, log ...

Finalement, ce ne serait qu'un cas d'école car dans la pratique, je ne vois pas à quoi ça pourrait servir. Mais c'est marrant.


thip
3
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
14 janv. 2010 à 15:49
Bonjour,

Pas facile à lire, à cette taille.

Il faut découper en paquet de puissance de 10.

ex: 12345
int(12345/10^3) = 12
12345 - 12*10^3 = 345

Tu peux travailler ainsi par paquet de 3 chiffres, en plus tu gagnes au séparateur de milliers.

thip
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
14 janv. 2010 à 16:13
heu, je pensais à un nombre qu'on ne sait pas stoquer dans une variable : si tu as un double, il me semble que
String.Format("{0:0}", 12345.67);
affiche 12345 donc devrait fonctionner pour toi, non?
String.Format("{0:0,0}", ... pour le séparateur de milliers : tu as toujours la notation scientifique ?

thip
0
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 3
14 janv. 2010 à 17:33
Salut,
J'ai bien compris le pourquoi de divisé par 1000 mais je n'y arrive pas...
Je ne sais pas combien de fois le faire, avec quelle valeur etc.

Voilà... si tu pouvais me donner un autre petit mot d'explication...
Merci d'avance

moi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
14 janv. 2010 à 17:53
Salut

Tu vas avoir un problème avec ce nombre, pour une raison très simple : aucun type de données .net ne permet d'avoir un nombre aussi précis.

Le type capable d'avoir la plus grande précision en langage .net est System.Decimal (128 bits).
Une telle variable peut supporter des nombres avec un maximum de 28 à 29 chiffres significatifs. J'en compte 65 sur ton nombre (ou 53 si on ne compte pas les 0 de fin, mais dans ce cas, ton écriture est incorrecte).

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
14 janv. 2010 à 17:58
Es-tu certains d'avoir autant de chiffres significatifs ?
Moi je reverrai la méthode de calcul pour découper les nombres en paquets de 12 chiffres par exemple (12 car j'arrive à lire)


thip
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
14 janv. 2010 à 18:08
Krimog : la valeur est entre double.minvalue et double.maxvalue, mais effectivement le nombre de chiffres significatifs en c# est de 28 (je ne savais pas, j'ai trouvé ça sur scribd.com)
Donc il faut réécrire une classe qui gère ça.
thip
0
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 3
14 janv. 2010 à 18:12
Re,
La en l'occurence c'est la factorielle de 50... Mais je voudrais aussi des racines carrées, des exposants etc. (Je cherche à avoir les 2 écritures.)

J'ai essayé toute la journée mais rien y fait... Je veux bien découper en 3 ou même 12, mais je ne sais pas comment on fait!!! Est-ce à préciseer que je suis nul en math?!?

Sinon le problème du System.decimal c'est que si le nombre est trop grand, j'ai une erreur. J'ai alors utilisé un exception mais ce n'est pas ce que je recherche...

Donc, toujours merci et à bientôt.
moi
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
14 janv. 2010 à 18:37
@Tpoinsot : le nombre de chiffres significatifs d'un DECIMAL est 28. Un double, c'est juste 15 chiffres significatifs (et un float, 7)

@moi411 : Si tu souhaites traiter des grands nombres avec beaucoup de chiffres significatifs, tu n'as pas le choix : tu dois créer ta propre classe. Cependant, si tu fais ainsi, tu devras recoder TOUTES les opérations. + - c'est facile, * / c'est déjà plus dur, mais tu risques surtout d'avoir un mal de chien à faire des opérateurs tels que sqrt (racine carrée)

A moins que tu trouves sur internet quelqu'un qui ait déjà créé ce genre de classe.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
tpoinsot Messages postés 345 Date d'inscription mardi 1 juin 2004 Statut Membre Dernière intervention 17 octobre 2014 4
14 janv. 2010 à 19:11
et il te faut la factorielle de 50 ?
donc je pense que tu dois écrire une classe qui gère de grands nombres (entiers j'espère) et redéfinir les opérations dont tu as besoin, sans oublier le tostring.
Quand tu additionne 2 nombres, tu as des retenues que tu reportes sur le chiffre à gauche. Là c'est pareil mais ta classe Chiffre doit représenter un nombre, et ses limite (en +) n'est pas 10 mais une valeur que tu fixe.
Gros truc. T'es sûr de ton coup ?

thip
0
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 3
14 janv. 2010 à 21:53
Re,
Et bien en fait non... Je ne suis plus très sûre de mon coup...
Sinon je n'ai pas spécialement besoin de de jouer sur des nombres aussi grand, c'était au cas ou...
En y réfléchissant, je vais me débrouiller avec le type décimal!

Sinon ça ressemblerait à quoi une classe pour grands nombres?

Merci pour votre temps!
moi
0
moi411 Messages postés 179 Date d'inscription samedi 22 novembre 2003 Statut Membre Dernière intervention 25 juin 2017 3
15 janv. 2010 à 16:27
Salut,
Ok je crois que j'ai comprit, je me suis fait une raison et j'ai finalement garder le type decimal! En attendant je vais quand-même essayer de la faire cette classe, histoire de ne pas rester sur un échec!!!

Merci pour les coups de mains.
moi
0
Rejoignez-nous