IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

chiffre avant la Virgule


Sujet :

C#

  1. #1
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut chiffre avant la Virgule
    Salut le Forum;

    Je voudrais savoir si il y a une fonction en c# pour extraire par exemple le 2 du nombre decimal : 2,9870.

    En fait j'aimerais transformer ce chiffre en binaire et pour ce faire je dois tout d'abord transformer la partie avant la virgule et ensuite la partie apres la virgule et ainsi pour avoir la representation en binaire a la fin!!!

    Merci...

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Tu peux utiliser Math.Floor pour obtenir la partie entière, et retrancher la partie entière à la valeur initiale pour obtenir la partie décimale (attention aux nombres négatifs : Floor renvoie le plus grand entier inférieur à l'argument, donc pour -2.5, Floor renverra -3... tu peux utiliser Ceiling à la place pour les nombres négatifs)

    Mais de toutes façons, si le but est de convertir en binaire, inutile de réinventer la roue : la classe BinaryWriter fait ça très bien (avec la méthode Write)

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Sans passer par un stream, il y a d'autres moyens.

    Sans mener à réinventer la roue :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double v = 2.5;
    byte[] v_bytes = BitConverter.GetBytes(v);

    En ayant au final à réinventer la roue :
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    double v = 2.5;
    var str = v.ToString(System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
    string[] str_i = str.Split(new string[]{System.Globalization.CultureInfo.InvariantCulture.NumberFormat.NumberDecimalSeparator}, StringSplitOptions.None);
    int i_a = int.Parse(str_i[0]);
    int i_b = str_i.Length > 1 ? int.Parse(str_i[1]) : 0;

    ps. on est obligé d'utiliser System.Globalization.CultureInfo.InvariantCulture car par exemple sur un OS anglais le séparateur des décimaux c'est '.' alors que sur un OS français c'est ','.

  4. #4
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Mais OUI!!! Merci pour les reponses!!

    Je pensais qu'il y avais pas d'autre alternatives....

    Comment on utilise BinaryWrite pour afficher la valeur binaire d'un nombre decimal? j'ai lu sur msdn mais c 'est plutot genre Stream mais moi je suis pas si loin!!!
    http://msdn.microsoft.com/fr-fr/libr...arywriter.aspx

    Merci!!

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    en fait il vaut mieux que tu utilises le BitConverter, comme indiqué par smyley, ce sera plus simple...

  6. #6
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Ouais j'ai essaye :

    double valeur = 3.24
    Int64 buffer = BitConverter.DoubleToInt64Bits((double)m.Fliess);
    string value = Convert.ToString(buffer, 2);
    Console.WriteLine("{0}", value);

    ca me donne value = "100000000001001111010111000010100011110101110000101000111101100"

    la reponse est elle correcte?

    j'ai fais une comparaison ici :
    http://babbage.cs.qc.edu/IEEE-754/Decimal.html

    comment avoir le resultat mais avec 32 bits?

    mon objectif est d'implementer une interface coe la page web precedente...
    J'espere que j'y arriverais !!!

  7. #7
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Je ne sais pas ce que ça devrait donner en binaire, je me suis jamais beaucoup intéressé à l'encodage de valeurs flottantes en binaire

    Par défaut, 3.24 est traité comme un double (64 bits) et non comme un float (32 bits). Pour qu'il soit considéré comme un float, il faut l'écrire 3.24F

  8. #8
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Merci a toi Tomlev!!!

    Mais ma question etais plus du genre comment convertir du double au binaire 32 bits???

    tout en sachant qu'avec 64bits on utilise :
    Int64 buffer = BitConverter.DoubleToInt64Bits(valeur).


    Merci

  9. #9
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Nani ?
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    double double_value = 2.4;
    byte[] buffer = BitConverter.GetBytes(double_value);
    double_value = BitConverter.ToDouble(buffer, 0);
    long ln = BitConverter.ToInt64(buffer, 0);

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par 3logy Voir le message
    Mais ma question etais plus du genre comment convertir du double au binaire 32 bits???
    Ben un double fait 64 bits, pas 32... si tu le codes sur 32 bits, tu perds de la précision, ce n'est plus un double mais un float (ou Single)

  11. #11
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Okay Merci aux deux!!

    Bon j'ai fais ceci!!! :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public void ToHex64(double _value)
            {
                byte[] buffer = BitConverter.GetBytes(_value);
                long ln = BitConverter.ToInt64(buffer, 0);
                string value = Convert.ToString(ln, 16);
                Console.WriteLine(value);
            }
            public void ToBin64(double _value)
            { 
                Int64 buffer = BitConverter.DoubleToInt64Bits(_value);
                string value = Convert.ToString(buffer, 2);
                Console.WriteLine(formatter, _value + " ", value, "8Bytes");
            }
    CECI me donne la representation IEEEE du double en 8Bytes(64bits) Binaire et Hex....

    Bon apparement ca marche!!!

    Et si a partir de la valeur "double _value" je veux obtenir un float(single) et la represente sous forme binaire et Hexadecimal .... Bref representer un double sous sa forme IEEEE mais 4Bytes(32bits)

    - public void ToHex32(double _value)...
    - public void ToBin32(double _value)...

    Comment je fais?

  12. #12
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Bah
    Code c# : Sélectionner tout - Visualiser dans une fenêtre à part
    float v = (float)(double_value);
    Par contre il est probable que tu ai des erreurs d'arrondi, ou des choses genre 0.99999999 au lieu de 1.
    Sinon le reste de ton code reste sensiblement le même, avec float à la place de double, int à la place de long, Int32 à la place de Int64 ...

  13. #13
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    OK!! Merci!!! je crois ca marche!!!

    mais maintenant j'ai un probleme sur l' affichage

    alors mon resultat se presente sur la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    01000000010010010000111111011010

    et j'aimerais l'avoir affiche sous la forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0100 0000 0100 1001 0000 1111 1101 1010
    je suis pas tres pointu sur la concatenation des strings sur C# alors...si quelqu'un peux m'aider !!!

  14. #14
    Membre habitué Avatar de Antho42
    Profil pro
    Inscrit en
    Février 2009
    Messages
    173
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 173
    Points : 161
    Points
    161
    Par défaut
    Tu peux jouer avec la méthode Insert() sur ton string pour faire des insertions d'un espace tous les 4 caractères. Tu fais ça dans une boucle.

    Attention cependant, si ma mémoire est bonne, le binaire se lit de droite à gauche, donc insère de droite à gauche également, au cas ou le nombre de bits ne serait pas un multiple de 4, pour bien te retrouver avec un couple "non fini" à gauche. Je m'explique :

    Si tu as :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1000000010010010000111111011010
    Il ne te faut pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1000 0000 1001 0010 0001 1111 1011 010
    Mais bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    100 0000 0100 1001 0000 1111 1101 1010
    Ça devrait être simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                string binaire = "1000000010010010000111111011010";
     
                MessageBox.Show("Avant : " + binaire);
     
                for (int i = binaire.Length; i > -1; i -= 4)
                    binaire = binaire.Insert(i, " ");
     
                MessageBox.Show("Apres : " + binaire);

  15. #15
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Merci Anthon!!!

    J'essaye de suite !!!

  16. #16
    Membre actif Avatar de 3logy
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Août 2007
    Messages : 280
    Points : 222
    Points
    222
    Par défaut
    Ouais ca Marche Merci!!!

    BEH VOILA J'ai une derniere Question!!!

    Alors en entrant la valeur 3.14159265 : J'obtiens la valeur arrondie du Binaire cad :
    -
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0100 0000 0100 1001 0000 1111 1101 1011
    Comment obtenir la valeur non arrondie (voir http://babbage.cs.qc.edu/IEEE-754/Decimal.html) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    0100 0000 0100 1001 0000 1111 1101 1010
    OKAY MERCI DE TOUTES MANIERES A TOUS

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Récupérer certains chiffres avant et après le virgule dans un nombre
    Par gerarddurand dans le forum VBA Access
    Réponses: 4
    Dernier message: 06/12/2012, 15h26
  2. Commande pour afficher des chiffres apres la virgule
    Par manar dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/09/2004, 18h28
  3. Chiffres après la virgule figés
    Par bondjames dans le forum Bases de données
    Réponses: 6
    Dernier message: 10/03/2004, 23h09
  4. [MFC] Nombre de chiffres après la virgule
    Par karl3i dans le forum MFC
    Réponses: 3
    Dernier message: 27/01/2004, 13h04
  5. Nb de chiffres après la virgule ?
    Par Thcan dans le forum C
    Réponses: 10
    Dernier message: 17/09/2003, 21h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo