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

Langage Java Discussion :

Se débarrasser du zéro négatif


Sujet :

Langage Java

  1. #1
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Par défaut Se débarrasser du zéro négatif
    Salut,

    Dans un générateur d'échelle automatique où les graduations affichées sont des doubles traités par DecimalFormat, le zéro apparaît souvent sous forme de zéro négatif (-0), ce qui est un peu idiot pour une graduation. Sauriez-vous comment le retransformer en bon vrai zéro positif?

  2. #2
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    tu pourrais le multiplier par -0, ce qui devrait donner 0 non ?!

  3. #3
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Par défaut
    Formidable! j'n'y avais pas pensé une seconde...

    Trop facile, bien sûr. Maintenant, l'ennui c'est qu'il va falloir détecter le -0 en scrutant chaque valeur qui défile dans la boucle génératrice, et détecter un double -0.0 de valeur réelle fluctuante (c'est en fait le résultat d'un arrondi effectué par DecimalFormat), y'a plus amusant!

    Cela étant, ma question était peut-être trop imprécise. A priori, je ne pense pas pouvoir y arriver de façon simple en effectuant une opération sur -0 au stade numérique. La question serait plutôt : Y a-t-il quelque chose à faire dans DecimalFormat ou consorts pour forcer l'affichage (c'est-à-dire la String) en un zéro pur et dur lorsqu'on lui fournit un tout petit négatif, bien inférieur à la limite d'arrondi fixée par le nombre de décimales?

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Et avec un simple if ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(graduation.equals("-0.0")) {
        graduation = "0.0";
    }
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  5. #5
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Par défaut
    Bien sûr, on peut le faire aussi. Mais être obligé de parser des String (car c'est cela qui est sous-jacent au equals, n'est-ce pas?) sur toutes les valeurs qui sortent, juste pour corriger un éventuel défaut d'affichage, berk! berk! berk!, c'est encore pire que comparer des doubles.

  6. #6
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 104
    Par défaut ...Idée de boulet...
    JE crois pas qu'il y ait de fonction abs(...) mais si tu fais max(nombre,-nombre) ça serait intéressant ? enfin Dsl, je dis ça comme ça à quelques heures de mon bac blanc, de derrière mon téléphonne, si ça se trouve c'est idiot...

  7. #7
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Par défaut
    Euh... non, du moins si je t'ai bien compris.
    Math.max(nombre, -nombre) appliqué indistinctement à toutes les valeurs va rendre positifs tous les négatifs, et mon échelle s'étend aussi dans le domaine négatif, si! si!
    Sinon, on en revient à cribler les valeurs, trouver les négatifs, dans une marge d'incertitude...

    A part ça, que la force t'accompagne
    (euh, c'est comme ça qu'on dit?)

  8. #8
    Membre éprouvé
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Par défaut
    Citation Envoyé par janef
    A part ça, que la force t'accompagne
    (euh, c'est comme ça qu'on dit?)
    C'est "Que la force soit avec toi" .
    Bon pour revenir a ton problème, tu as donc un zéro négatif que tu aimerais avoir un positif. Question : tu veux le mettre positif quand tu l'affiches ou même en temps que Decimal Format ? Parce que cela pourrait simplifier les choses...

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2006
    Messages : 24
    Par défaut
    Idée sortie de derrière un buisson:
    Tu peux lui rajouter sa propre valeur afin qu'il passe au dessus du zéro, l'arrondi se fera alors en positif.... j'espère

  10. #10
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 104
    Par défaut
    OUI, mdr c'était bien ça mon idée. enfin c'est vrai que si ton repère re ballade aussi sur R- c'est tout de suite moins intéressant... :p
    grâce à toi, la force m'accompagnera, c'est certain ^_^ !

  11. #11
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Par défaut
    Citation Envoyé par NicolasGuyomar
    Tu peux lui rajouter sa propre valeur afin qu'il passe au dessus du zéro, l'arrondi se fera alors en positif.... j'espère
    Là ch'te suis pas : (-epsilon) + (-epsilon), ça fait toujours un -epsilon
    Par ailleurs : (-epsilon) + Math.abs(-epsilon), ça fait probablement 0 ; mais si on l'applique à tout venant : (x) + Math.abs(x), ça fait 0 ou 2x selon le signe de x, et mon échelle elle fait la gueule.

    Citation Envoyé par Janitrix
    Question : tu veux le mettre positif quand tu l'affiches ou même en temps que Decimal Format ? Parce que cela pourrait simplifier les choses...
    Pas bien saisi la question, mais voilà en résumé :
    1) On génère une série croissante de doubles d (passant éventuellement tout près de 0)
    2) On les formate en String avec DecimalFormat comme suit :
    String àAfficher = decimalFormat.format(d);

    Et de temps à autre, selon les cumuls d'erreurs, un zouli "-0" vient faire coucou.

  12. #12
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 821
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 821
    Par défaut
    Salut,

    Citation Envoyé par janef
    1) On génère une série croissante de doubles d (passant éventuellement tout près de 0)
    Ben teste à cette étape si la valeur que tu génères est entre -epsilon et 0. Comme ça pas besoin de parser de string, tu bosses direct sur des doubles.
    Et si elle y est, tu la mets à 0.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  13. #13
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Par défaut
    Eh oui! C'est lourd, c'est moche, mais n'y a malheureusement que ça semble-t-il.

    J'espérais un bidule à régler dans DecimalFormat, auquel je pige pas grand-chose, mais si personne n'intervient dans ce sens, on va peut-être arrêter les frais et clore le sujet avec un résolu.

  14. #14
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 821
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 821
    Par défaut
    Citation Envoyé par janef
    Eh oui! C'est lourd, c'est moche, mais n'y a malheureusement que ça semble-t-il.
    Lourd? Moche? Y'a pire...

    Sinon, passe par un Math.round(..) sur la bonne valeur pour virer les décimales en trop...
    Mais ça sera aussi lourd et moche.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  15. #15
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 104
    Par défaut
    SINON au pire ya math.floor( qui t'arrondira ça comme y faut, et si le but c'est de pondre un string, ça marche pas en concaténant avec un truc genre ""+double ?

  16. #16
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 104
    Par défaut
    NAN, c'est bon, j'ai trouvé un truc propre qui marche : g.drawstring(""+(math.upl(e)<=math.E-300?0:e), x, y);
    excusez la balise code, mais je peux pas sur mon téléphone

  17. #17
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 821
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 821
    Par défaut
    Citation Envoyé par rom1dep
    NAN, c'est bon, j'ai trouvé un truc propre qui marche
    Mdr!
    C'est quasiment le truc que tu as traité de "lourd et moche" tout à l'heure!!!
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  18. #18
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 104
    Par défaut
    HEU... t'es sur ? mdr ben l'avantage c'est que ça marche et que même si c'est l'équivalent d'un if ça tient en une ligne, ça se case ni vu ni connu dans et ça se concat bien avec un string... c'est l'essentiel, non ? :p

  19. #19
    Membre averti
    Inscrit en
    Septembre 2005
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 26
    Par défaut
    Citation Envoyé par plegat
    Mdr!
    C'est quasiment le truc que tu as traité de "lourd et moche" tout à l'heure!!!
    "Lourd et moche", c'est moi qui l'ai dit, et j'assume. C'était pas pour te vexer, mais comme l'idée, assez évidente, m'était déjà venue, comme cela transparaît des posts précédents, ces termes ne fustigeaient que ma propre pensée.

    Citation Envoyé par rom1dep
    NAN, c'est bon, j'ai trouvé un truc propre qui marche : g.drawstring(""+(math.upl(e)<=math.E-300?0:e), x, y);
    Ben là ch'peux pas dire que ch'te file vraiment le train!
    Il semble que ta formule détecte les vrais epsilons, du moins ceux qui sont impliqués par le format double, c'est bien ça? Soit, toutefois je doute que mon générateur cumulard d'erreurs veuille bien rester en-deçà de cette limite.
    Et puis, j'l'aime bien le DecimalFormat, il fait plein de trucs tout seul, comme les arrondis, que ce serait assommant de se coltiner à la paluche.

    Tenez, à brûle-pourpoint, pour les curieux qui auraient cinq minutes à perdre, je joins le code de la chose. Fouillez pas trop dedans, c'est du brouillon total en l'état. Suffit de compiler et de lancer avec deux nombres, par exemple : java Test -3.2 2.5 ou tout ce qui vous chantera.
    En élargissant ou réduisant à la souris, selon votre affichage, vous devriez voir apparaître un "-0".
    Fichiers attachés Fichiers attachés

  20. #20
    Membre éprouvé
    Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 104
    Par défaut
    LOL nan, mon truc n'a rien d'exceptionnel, ça te permet juste de comparer des valeurs avec les opérateurs ternaires ? et : et il faut savoir que la valeur exacte de -0.0 est 4.9*10^-324 c'est tout

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. À propos des Zéros négatifs
    Par ceugniet dans le forum Ordinateurs
    Réponses: 2
    Dernier message: 25/04/2010, 16h34
  2. Formatage du zéro négatif avec NumberFormat
    Par Romz_Java dans le forum Général Java
    Réponses: 5
    Dernier message: 24/03/2010, 10h18
  3. Se débarrasser du warning : division par zéro
    Par liverbird dans le forum Langage
    Réponses: 3
    Dernier message: 11/07/2007, 11h38
  4. Valeurs Nulles ou Valeurs à Zéro
    Par LLaurent dans le forum XMLRAD
    Réponses: 5
    Dernier message: 30/07/2003, 12h40
  5. probleme avec une division par zéro
    Par jcharleszoxi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/03/2003, 19h14

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