Page 1 sur 1

TP_Thread_Arrondi

Publié : 11 mars 2017 9:02
par StevenW
Bonjour,

Pour l'arrondi à un chiffre après la décimale de la valeur issue du capteur j'utilise la classe BigDecimal et voici le code :

Code : Tout sélectionner

String valeur = (String) stringTokenizer.nextElement();
float resultat = Float.parseFloat(valeur);
BigDecimal bd = new BigDecimal(Float.toString(resultat));
bd = bd.setScale(1, BigDecimal.ROUND_UP);
resultat = bd.floatValue();
Le paramètre d'arrondi de la fonction setScale possède huit variantes:
ROUND_CEILING (4 échecs)
ROUND_UP (4 échecs)
ROUND_HALF_UP (2 échecs)
ROUND_DOWN (non testé)
ROUND_FLOOR (non testé)
ROUND_HALF_DOWN (non testé)
ROUND_HALF_EVEN (non testé)
ROUND_UNNECESSARY (non_testé).

J'en suis déjà à quatre tentatives et je ne pourrai pas tous les tester.
Donc déjà est ce la bonne méthode pour effectué l'arrondi? Si oui quel paramètre pensez vous être le bon?

Merci pour votre aide.

Cordialement,

Steven

Re: TP_Thread_Arrondi

Publié : 11 mars 2017 18:36
par TSwank
Bonjour,

J'ai la même erreur :
There was 1 failure: 1) test_bon_affichage2(question1): taux tronqué, au 1/10 ???
Mon code :

Code : Tout sélectionner

  public  float value() throws Exception{
    String req = this.request(), retStr = "";
    StringTokenizer st = new StringTokenizer(req, "=");
    while (st.hasMoreTokens())
      retStr = st.nextToken();
    BigDecimal bd = new BigDecimal(retStr);
    bd = bd.setScale(1, BigDecimal.ROUND_HALF_UP);
    return bd.floatValue();
  }
Je n'arrive pas à comprendre le problème.

Est-ce que quelqu'un a une idée?

Thomas

Re: TP_Thread_Arrondi

Publié : 11 mars 2017 20:29
par fcollet
Bonjour,

Vous trouverez certainement votre bonheur en consultant le sujet du tp2 du NFP121

Frédéric

Re: TP_Thread_Arrondi

Publié : 11 mars 2017 20:53
par TSwank
Bonjour Frédéric,

Merci pour votre réponse.

Ce qui m'étonne c'est qu'en comparant la valeur obtenue avec la chaîne request, les arrondis ont l'air normaux...

Ci-dessous, quelques résultats:

Code : Tout sélectionner

# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=41.761654  ->  41.8
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=26.594019  ->  26.6
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=2.4867828  ->  2.5
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=47.256805  ->  47.3
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=84.873726  ->  84.9
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=44.66832  ->  44.7
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=70.15546  ->  70.2
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=29.27166  ->  29.3
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=8.469097  ->  8.5
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=30.829302  ->  30.8
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=37.182446  ->  37.2
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=79.214966  ->  79.2
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=36.299713  ->  36.3
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=97.82722  ->  97.8
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=92.65808  ->  92.7
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=71.70542  ->  71.7
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=67.96272  ->  68.0
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=41.92974  ->  41.9
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=85.36304  ->  85.4
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=59.06821  ->  59.1
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=98.54822  ->  98.5
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=47.878788  ->  47.9
# ibutton: DS2438; Adapter: DS9097U; Port: COM2;<br>1C0000000D536B26=27.349966  ->  27.3
Ou alors, est-ce qu'il faut utiliser une autre règle d'arrondis?

Thomas

Re: TP_Thread_Arrondi

Publié : 11 mars 2017 22:11
par StevenW
Bonjour,

Frédéric :
Merci pour l'info, j'ai regardé le Tp2 de NFP121, il n'y a malheureusement aucune référence au sujet de l'arrondi. Je pense que c'est dans autre Tp de NF121. Je vais voir.

Thomas :
J'ai essayé cette fonction de la classe Math mais j'ai trois échecs, pourtant elle arrondi bien au plus près du zéro ex: 32.67 -> 32.7

Code : Tout sélectionner

float temp = Float.parseFloat(String valeur);
float resultat = (float) Math.round(temp * 10f) / 10f;
Continuons à chercher mais je n'ai plus qu'une seule tentative, donc s'il t'en reste tu peux essayer autre chose, moi je vais rester sur le paramètre BigDecimal.ROUND_HALF_UP.

Bonne chance,

Steven.

Re: TP_Thread_Arrondi

Publié : 11 mars 2017 23:48
par StevenW
Rebonjour,

Frédéric :
Mea culpa, la réponse est bien dans l'énonçé du Tp2 de NFP121, en plus je l'avais fait l'année dernière. Je finis avec 4 échecs en perdant trop de temps sur le net à trouver la formule magique, au lieu de bien lire l'énonçé, trop déçu.

Thomas :
J'espère que tu as trouvé la formule.

Steven

Re: TP_Thread_Arrondi

Publié : 12 mars 2017 2:00
par TSwank
J'avoue ne pas avoir trouvé la formule permettant de résoudre le problème dans l'énoncé.
Et il ne me reste qu'un essai, donc je préfère en rester là.

Merci pour le tuyau en tout cas !

Re: TP_Thread_Arrondi

Publié : 12 mars 2017 18:00
par Fujimoto
Bonjour,

pour ne garder qu'un seul chiffre après la virgule, j'ai multiplié la valeur par 10 puis je le cast en int pour perdre les autres chiffres puis je le re-cast en float et je divise par 10. Les test JNews ont été ok.

((float)((int)(value*10)))/10

Re: TP_Thread_Arrondi

Publié : 13 mars 2017 22:03
par TSwank
Fujimoto a écrit :
12 mars 2017 18:00
Bonjour,

pour ne garder qu'un seul chiffre après la virgule, j'ai multiplié la valeur par 10 puis je le cast en int pour perdre les autres chiffres puis je le re-cast en float et je divise par 10. Les test JNews ont été ok.

((float)((int)(value*10)))/10
Bonjour Fujimoto,

Tu me sauve la mise !

Merci pour ton aide.

Thomas