Conception de logiciels Intranet : patrons et canevas
Modérateurs : Douin, graffion
-
StevenW
- Messages : 14
- Inscription : 11 mars 2017 8:29
Message
par StevenW » 11 mars 2017 9:02
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
-
TSwank
- Messages : 8
- Inscription : 05 juin 2014 11:03
Message
par TSwank » 11 mars 2017 18:36
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
-
fcollet
- Messages : 6
- Inscription : 16 nov. 2016 11:14
Message
par fcollet » 11 mars 2017 20:29
Bonjour,
Vous trouverez certainement votre bonheur en consultant le sujet du tp2 du NFP121
Frédéric
-
TSwank
- Messages : 8
- Inscription : 05 juin 2014 11:03
Message
par TSwank » 11 mars 2017 20:53
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
-
StevenW
- Messages : 14
- Inscription : 11 mars 2017 8:29
Message
par StevenW » 11 mars 2017 22:11
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.
-
StevenW
- Messages : 14
- Inscription : 11 mars 2017 8:29
Message
par StevenW » 11 mars 2017 23:48
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
-
TSwank
- Messages : 8
- Inscription : 05 juin 2014 11:03
Message
par TSwank » 12 mars 2017 2:00
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 !
-
Fujimoto
- Messages : 9
- Inscription : 02 oct. 2016 15:02
Message
par Fujimoto » 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
-
TSwank
- Messages : 8
- Inscription : 05 juin 2014 11:03
Message
par TSwank » 13 mars 2017 22:03
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
Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 1 invité