Dagry
Messages postés29Date d'inscriptionsamedi 17 mars 2007StatutMembreDernière intervention 1 septembre 2008
-
29 août 2008 à 21:27
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 2009
-
12 sept. 2008 à 21:45
Bonjour à tous! je me tourne encore vers vous pour m'aider à résoudre un problème. J'aimerais savoir comment connaitre le nombre de chiffres après la virgule d'un nombre décimal. je compte sur vous. merci de votre aide!
PCPT
Messages postés13272Date d'inscriptionlundi 13 décembre 2004StatutMembreDernière intervention 3 février 201847 30 août 2008 à 15:35
gillardg -> le code que j'ai proposé (mis en pratique par kevin), pour cet exemple de "123.123" ne doit pas retourner "123" mais (val)"3" = > 7-3-1, donc bien un integer
candyraton -> la droite est recherchée, pas la gauche ^^
s'il y a dans le framework, çà serait du genre Math.GetDecimals (je doute que çà existe mais pourquoi pas)
<hr size ="2" width="100%" />Prenez un instant pour répondre à [infomsg_SONDAGE-POP3-POUR-CS_769706.aspx ce sondage] svp
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 1 sept. 2008 à 02:20
Re,
Gillardg et PCPT > Ouais, l'integer contient le nombre de décimal, rien d'autre.
Candyraton > "surement parceque c un double(8 octets),non?" Ben... non La ligne de code suivante est ou double :
Dim value As Double = 123456789.12345679
J'ai écris 789 à la fin, mais ça s'est automatiquement changé en 79, c'est là la limite du double. Le 457 est une réduction du nombre de décimale par rapport au Double. D'ailleurs IntelliSense et ToString("R") affichent bien 79 (c'est les 2 seules façons que j'ai trouvé pour afficher la valeur exact).
"indexof est de la classe compareinfos (je vois pas l'avantage par rapport a split)" Plus rapide je pense, il faut juste trouver la position d'un caractère, pas besoins de traiter la chaine de caractère et créer le tableau.
"Mais voilà, ça renvoi 0.449999999999818!!???" Ben ouais, ça n'a rien d'étonnant. Il faut faire gaffe avec les nombres à virgules flottantes, ça fait toujours ce genre de choses, cet effet vient des arrondis. Pour ça que je pense qu'il est impossible de faire ça autrement qu'en passant par des Strings.
Mais si on connaissait la plage des valeurs que tu peux avoir, ça pourrait nous dire quels méthodes sont possibles ou non.
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 1 sept. 2008 à 18:24
Bonjour,
Kevin, je pense qu'il est inutile d'aller plus loin dans la recherche de la bonne réponse... En effet, on ne peut pas répondre parfaitement informatiquement.. Le nb de décimal d'un nombre peut-être impossible à déterminer, comme tu le soulignes, à cause des inévitables arrondis... Ensuite, reste le côté pratique, d'où ma demande "pourquoi tu as besoin d'extraire la partie décimale" qui n'a pas reçu de réponse... dommage, car finalement tu arrives à cette même question...
Mais il semble, qu'extraire la partie décimale de la string soit suffisant ici...
Amicalement,
Us.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Dagry
Messages postés29Date d'inscriptionsamedi 17 mars 2007StatutMembreDernière intervention 1 septembre 2008 1 sept. 2008 à 21:53
Bonjour à tous !!!
je vous suis reconnaissant des réponses que vous apportez mais on dirait que nous ne nous comprenons pas. Il s'agit de connaitre le nombre de chiffres après la virgule et non la partie décimale (sinon merci pour les réponses)
J'ai trouvé quelque chose que je juge plus simple il s'agit de mettre le nombre sous la forme aE-b. dans le cas le nombre de chiffres après la virgule est b
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 2 sept. 2008 à 09:40
Resalut,
us > Effectivement, une réponse à ta question aurait été plus qu'utile pour trouver une réponse adéquate. Pour ce qui est d'extraire la partie décimale d'un String, on est bien d'accord, mais encore faut-il trouver le String... c'est là que ça coince encore un peu.
Je pense que s'il s'agit de trouver le nombre de décimale d'un nombre trouvé par calcul, cela sera effectivement impossible car sujet à de grossière erreurs provenant des arrondis, du genre 5/2 = 2.4999999999999999. Par contre si la source du nombre est un String comme une lecture d'une valeur dans un fichier ou une entrée manuelle par un utilisateur, il est possible de garantir une réponse correct.
candyraton >
Pour que ce soit clair pour tout le monde:
Dans le code j'ai écris: Dim Value As Double = 123456789.123456789, c'est à dire 2 fois de 1 à 9.
Mais l'éditeur de code à automatiquement changé cette valeur en 123456789.12345679, il a supprimé le dernier chiffre significatif, je pense (par vérifié) que c'est la limite du Double.
Mais lorsque un fait un Double.ToString autre qu'avec le format Round-trip , il affiche 123456789.123457, 3 chiffres significatifs on été perdu, 2 de plus que ce qu'une variable Double peut contenir. Pourquoi?
Dagry > Je pense que l'on se comprend parfaitement, même si effectivement nos termes ne sont pas toujours corrects.
"Un nombre décimal est un nombre possédant un développement décimal limité" Mais pour nous, ce qui est important et comme on l'entendait, Nombre de décimales = Nombre de chiffres après la virgule.
"il s'agit de mettre le nombre sous la forme aE-b. dans le cas le nombre de chiffres après la virgule est b"
Oui mais alors a doit être un entier! Mais aucune méthode ne permet d'obtenir un résultat sous la forme aE-b ou a est un entier.
() > Après une recherche sur Google, il semble que la plupart des gens cherchants une réponse au même problème soit satisfaient par la réponse Value - Int(Value). Mais il s'agit souvent de simplement extraire la partie décimale du nombre, dans quel cas un arrondis ne fausse pas complètement le résultat. Dans notre cas, cette méthode n'est pas viable.
Suite à tout cela, je pense que : - trouver le nombre de chiffres après la virgule d'un nombre trouvé par calcul est impossible sans risquer de grossières erreurs provenant des arrondis, ce qui fausse complètement le résultat.
- il faut utiliser la méthode ToString("R"), c'est la seule que j'ai trouvé qui donne un résultat correct. Mais cette méthode pouvant afficher un résultat en notation scientifique, il faut détecter et gérer la notation exponentielle dans le code.
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 2 sept. 2008 à 10:27
Pour prouver que les résultats des calculs peuvent donner une réponse complètement fausse, il suffit de remplacer
Dim value As Double = TextBox1.Text
par
Dim value As Double = 1.2 - 1
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 2 sept. 2008 à 15:51
Ah et apparemment leDecimal.TryParse n'enlève pas les 0 non significatif
0,0000 = 4 chiffres après la virgule. Ca n'a pas été précisé, mais normalement on ne veut que les chiffres significatifs
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 2 sept. 2008 à 22:37
Bonsoir,
Voici une alternative aux codes précédents qui me semble correcte :
PrivateSub TextBox2_KeyDown(ByVal sender AsObject, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox2.KeyDownIf e.KeyCode = Keys.Enter Then
Dim lg AsLong
Dim x AsDecimal
Decimal.TryParse(TextBox2.Text, x)
x = CDec(Val(CDbl(x - Int(x))))
lg = x.ToString.Length - 2
If lg < 0 Then lg = 0
MsgBox(lg)
EndIf
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 2 sept. 2008 à 22:54
et encore une fois ! (j'arrête plus ce soir...)
une écriture condensée donne ceci :
If e.KeyCode = Keys.Enter Then
Dim lg AsLong
Dim x AsDecimal
Decimal.TryParse(TextBox2.Text, x)
lg = CDec(CDbl(x - Int(x))).ToString.Length - 2
MsgBox(IIf(lg > 0, lg, 0))
EndIf
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 2 sept. 2008 à 23:00
Oui, ben, non, en fait... J'ai plutôt une question cette fois...
Je passe par un Double car pour extraire la partie entière INT marche pour ce type... Je suis en option Strict... Est-ce qu'il existe l'équivalent de INT pour le type Décimal ? ... si oui, alors le code pourrait être encore plus simple, et répondre parfaitement à la question initiale, me semble-t-il...
Amicalement,
Us... qui va se coucher cette fois ci... et pour de bon !
cs_candyraton
Messages postés109Date d'inscriptiondimanche 27 juillet 2008StatutMembreDernière intervention 2 février 20123 3 sept. 2008 à 07:29
Bonne nuit
Kevin (bonne question)
Peut etre est ce parcequ'en + de l'arrondi du dble la fonction Str prévoit 1 espace à gauche pour le signe?
(j'le trouve joli ton 1° code avec gestion des E).
Bonjour en suisse
(pcpt) Math.Truncate c sur framework 3.5 (j'avais pas fait attention).
Regex g pas.
Pour moi svalue.lenght c'est len(svalue) sur quoi travaillez-vous?
US30: Tu dois avoir raison, il semble que int est plus simple que round car les fonctions Fix et Int tronquent la partie décimale d'un
nombre sans forcément l'arrondir.
En outre, les fonctions Fix et
Int renvoient toujours une valeur du type passé.
Et puis, plus besoin de split ou indexof, ni même de culture.
bien vu Gillardg:convertir Text1.Text en decimale pour ne pas etre limité
<title></title><style></style>
fo declarer :PublicStructureDecimalImplements IFormattable, IComparable, IConvertible, IComparable(OfDecimal), IEquatable(OfDecimal)
Namespace: System
Assembly: mscorlib (in mscorlib.dll)
Comment je fais pour savoir quelle reference je dois ajoutée (la ref nommée "system" n'est pas mscorlib.dll)?
Convertit la représentation String d'un nombre en Decimal équivalent
c sur framework 3.0
fo declarer:PublicSharedFunction TryParse (s AsString,<OutAttribute> ByRef result AsDecimal) AsBoolean
Heureusement dans vb6 j'ai CDec
Je reprend sans librairie avec int et CDec
'bien vu Gillardg: convertir Text1.Text en decimale pour ne pas etre
'limité à 15 chiffres mais à 29 avant la virgule.
'je ne veux pas prendre n en entier dans une string (perte d'1 chiffre)
'et je sais que n - Int(n)enverra une reponse arrondie alors
'je traite directement en string Text1.Text
'Len(Str(Int(CDec(Text1.Text)))) ' represente le nbre de chiffres avant la virgule
'si je veux savoir ce qu'il y a aprés la virgule:
MsgBox "reponse: " & Right(Text1.Text, Len(Text1.Text) - (Len(Str(Int(CDec(Text1.Text))))))
'si je veux savoir combien:
MsgBox "reponse: " & Len(Text1.Text) - (Len(Str(Int(CDec(Text1.Text))))) & " chiffres aprés la virgule"
' et ça fonctionne avec 11111111112222222222333333333,111111111122222222223333333333444444444455555555556666666666777777777788888888889999999999
'1 inconvénient toutefois, il faut interdire ou gérer les 00012345
'meme avec CDec (comme tu dis Kevin).
Kevin.Ory
Messages postés840Date d'inscriptionmercredi 22 octobre 2003StatutMembreDernière intervention 7 janvier 200911 4 sept. 2008 à 23:43
"Peut etre est ce parcequ'en + de l'arrondi du dble la fonction Str prévoit 1 espace à gauche pour le signe?"
Un String n'est pas limité en taille, on peut y ajouter ce qu'on veut en plus de la valeur
"(j'le trouve joli ton 1° code avec gestion des E)" Merci
"Bonjour en suisse"
Salut
"Pour moi svalue.lenght c'est len(svalue) sur quoi travaillez-vous?"
Len(String) est une fonction de retro-compatibilité VB6. Il est conseillé de ne pas les utiliser car:
- Elles sont souvent moins performante que les fonction du framework
- Elles empêchent une conversion facile entre les langages du framework (String.Lenght existe aussi en C#, C++, etc. Alors que Len(String) n'existe qu'en VB)
"il semble que int est plus simple que round car les fonctions Fix et Int tronquent la partie décimale d'un nombre sans forcément l'arrondir."
Même remarque que la précédente Utiliser Math.Floor à la place (attention, par ex -2.9 donne -3 et pas -2, avec int ou floor)
"Et puis, plus besoin de split ou indexof, ni même de culture." Ouais, niveau perf c'est surement mieux, malgré l'utilisation de Decimal (a voir)
"bien vu Gillardg:convertir Text1.Text en decimale pour ne pas etre limité"
Ouais, je dois dire que je n'ai jamais travaillé avec les Decimal. Intéressant comme type, j'étudierai les aventages/inconvénient plus en détails à l'ocase
Mais je rappel que les chiffres non-significatifs ne sont pas tronqué lors d'une conversion String > Decimal: 000000123000.4500000 (les chiffres rouges restent)
La suite j'ai pas bien compris, tu n'as pas le type Decimal en .NET 2.0?
"split ou indexof, avec culture ont l'avantage de ne pas être limité à 29." J'en conclu que tu ne veux pas être limité par les limites de Double ou Decimal? Et donc que les sources de tes nombres sont des String? (J'avais posé la question sans avoir de réponse )
Si les sources sont des String, il est évident qu'il ne faut pas convertir tes nombre en Double/Decimal. Les conversions String =>Double/Decimal dans nos exemple n'étaient là que pour simuler une source de nombre en Double/Decimal
us_30
Messages postés2065Date d'inscriptionlundi 11 avril 2005StatutMembreDernière intervention14 mars 201610 5 sept. 2008 à 00:15
Bonsoir,
Bonnes remarques Kevin... Merci. Je reprends donc mon code avec cette version :
If e.KeyCode = Keys.Enter Then
Dim lg AsLong
Dim x AsDecimal
Decimal.TryParse(TextBox2.Text, x)
x = Math.Abs(x)
lg = CDec(CDbl(x - Math.Floor(x))).ToString.Length - 2
MsgBox(IIf(lg > 0, lg, 0))
EndIf
Pour mon code, donc, il n'y a pas le pb de chiffre non significatif...
Avec : 000000123000.4500000 on obtient la réponse 2 chiffres après la virgule... Ceci grâce au fait que je passe par la conversion en Double, qui supprime les zéros inutiles, contrairement au type Décimal... finalement assez curieux ce type... Le code de Gillardg, n'est pas parfait pour ce problème de zéros...
Ensuite, j'essayais de répondre à la question initiale de Dagry...
cs_candyraton
Messages postés109Date d'inscriptiondimanche 27 juillet 2008StatutMembreDernière intervention 2 février 20123 5 sept. 2008 à 21:38
hello,
Kevin, je te remercie encore;
Je pense que Dagry est satisfait des réponses apportée;
Je ne sais pas non plus si les sources sont des String et si la limite de 29 est genante.
"Mais lorsque un fait un Double.ToString autre qu'avec le format Round-trip, il affiche 123456789.123457, 3 chiffres significatifs on été perdu, 2 de plus que ce qu'une variable Double peut contenir. Pourquoi? "
J'espére que tu vas me donner la réponse!
Effectivement, int (2.9) donne bien 2 mais int (-2.9) donne -3; c teffectivement timportant.
"lors d'une conversion String > Decimal: 000000123000.4500000 (les chiffres rouges restent)"
PAS AVEC CDEC: CDec("000123") donne 123 !!!
(US-30 je crois qu'il faud l'abandonner)(United States?)
Je disais que
Decimal.TryParse c sur framework 3.0
Je ne crois pas l'avoir dans mon vb6
J'ai lu dans msdn (pour decimale:
Namespace: System
Assembly: mscorlib (in mscorlib.dll);
Si je selectionne "system" dans mes references
j'apprend que g la v2 de framework (mais system.tlb au lieu de mscorlib.dll).
M'est-t-il possible d'y mettre la v3?
(Avec ma version, avec ou sans "system.tlb",je tape decimal point et ça donne...rien du tout.)
Je lis que decimale est dans framework SDK 2
Espace de noms : System
Assembly : mscorlib (dans mscorlib.dll)
C du devellopement .net, que avec visual studio?
(j'avais cru comprendre que c'etait des bibliotheques compatibles plusieurs languages)
Je veux pas non plus trop sortir du sujet, déjà trés content d'avoir appris :
"moins performante que les fonction du framework et conversion facile"..............
J'apprend vraiement beaucoup de choses avec et grace à vous.
A plus