Ecriture standard et non scientifique d'un grand nombre [Résolu]

Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Dernière intervention
25 juin 2017
- - Dernière réponse : moi411
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
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
Afficher la suite 

Votre réponse

12 réponses

Meilleure réponse
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Dernière intervention
17 octobre 2014
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 95 internautes nous ont dit merci ce mois-ci

Commenter la réponse de tpoinsot
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Dernière intervention
17 octobre 2014
0
Merci
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
Commenter la réponse de tpoinsot
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Dernière intervention
17 octobre 2014
0
Merci
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
Commenter la réponse de tpoinsot
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Dernière intervention
25 juin 2017
0
Merci
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
Commenter la réponse de moi411
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
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é. -
Commenter la réponse de krimog
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Dernière intervention
17 octobre 2014
0
Merci
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
Commenter la réponse de tpoinsot
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Dernière intervention
17 octobre 2014
0
Merci
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
Commenter la réponse de tpoinsot
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Dernière intervention
25 juin 2017
0
Merci
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
Commenter la réponse de moi411
Messages postés
1863
Date d'inscription
lundi 28 novembre 2005
Dernière intervention
14 février 2015
0
Merci
@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é. -
Commenter la réponse de krimog
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Dernière intervention
17 octobre 2014
0
Merci
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
Commenter la réponse de tpoinsot
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Dernière intervention
25 juin 2017
0
Merci
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
Commenter la réponse de moi411
Messages postés
180
Date d'inscription
samedi 22 novembre 2003
Dernière intervention
25 juin 2017
0
Merci
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
Commenter la réponse de moi411

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.