Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > Arrondir une variable...
Arrondir une variable...
Par Skanzo Sylan le 14/1/2003 à 19:17:24 (#3020981)
J'ai un problème de calcul dans mes scripts. Je souhaiterais arrondir une variable à l'entier supérieur.
J'ai pu voir que les int étaient toujours arrondis à l'inférieur.
Par exemple 33 / 10 = 3.3 donc 3
Direct, j'ai pô cherché, j'ai ajouté 1 au résultat mais ça ne va pas dans le cas d'un resultat déja entier:
40 / 10 = 4.0 donc si j'ajoute 1, je me retrouve avec un resultat totalement faux, en l'occurence 5.
Ce que je cherche c'est pouvoir arrondir de cette façon :
9.9 = 10
10 = 10
10.01 = 11
10.7 = 11
11 = 11
11.2 = 12
etc..
Il me semble qu'on est pauvre en fonction mathématique pour scripter.
Pour ceux qui connaissent, l'équivalent en javascript serait Math.ceil :aide:
Merci de m'aider :merci:
Par Elivagar le 14/1/2003 à 20:06:21 (#3021393)
Pour avoir une virgule il faut un float, une variable flottante.
un peu plus de détail là
Par Skanzo Sylan le 14/1/2003 à 20:20:36 (#3021504)
Merci kan même d'avoir essayé :)
Par Jedaï le 14/1/2003 à 20:22:26 (#3021519)
Ca me rapelle un post où tu avais plusieurs personnes qui avait essayé de t'apprendre à faire assoir les NPC alors que tu te demandais si on pouvait rajouter cette options dans le menu radial....
Elivagar>> C'est bien d'expliquer à Skanzo que int c'est un entier, il le sait bien, merci pour lui, et relis donc son message !! :mdr:
Sinon ce que tu demande est faisable, je pense (pas sûr), avec cette fonction :
int Ceil(float f)
{
int n = FloatToInt(f);
if (f == n)
return n;
return n+1;
}
:cool:
A toi de tester !
Par Skanzo Sylan le 14/1/2003 à 20:29:50 (#3021590)
Par RAT le 14/1/2003 à 20:30:22 (#3021594)
Bon je m'explike , tu dois en fait, mettre le résultat sous deux types, un en int, et un en float.
donc si
int resultat, c1,c2,total;
float resultat2;
c1=40 ; c2=10
resultat=40/10; donc 4;
resultat2=IntToFloat(40/10) donc 4.0;
et tu fais une simple condition
if (( résultat2 - IntToFloat(resultat) )==0.0)
{
total=resultat;
}
else
{
total=resultat+1;
}
et voilà, normalement cela devrait marcher pour tous les cas de figure, j'en ferai un petit script sous forme de fonction si tu preferes pour que cela plus simple à utiliser mais plus tard dans la soirée, car là, je n'ai pas trop le temps.
Mais , normalement sur tout les cas de figure cela devrait marcher.
Par RAT le 14/1/2003 à 20:32:22 (#3021618)
Bon je pense que celui de jedaï est mieux :)
Par Jedaï le 14/1/2003 à 20:34:19 (#3021640)
Correction :
int Ceil(float f)
{
int n = FloatToInt(f);
if (f == IntToFloat(n))
return n;
return n+1;
}
Par Skanzo Sylan le 14/1/2003 à 20:34:58 (#3021650)
Aut'chose, si je crée cette fonction et que je la met dans un include, est-il possible de la réutiliser dans l'include lui-même, dans la definition d'une autre fonction?
Par Jedaï le 14/1/2003 à 20:45:48 (#3021760)
//Tous les commentaires justes au dessus du prototype sont automatiquement
//affiché si on clique sur la fonction dans un script qui compilé une fois au moins
int Ceil(float f);
Une fois que tu as mis ça au début, tu peut mettre le corps de la fonction n'importe où et l'utiliser dans toutes les autres fonctions :
int Div(int n1, int n2)
{
float f = n1 / n2;
return Ceil(f);
}
int Ceil(float f)
{
int n = FloatToInt(f);
if (f == IntToFloat(n))
return n;
return n+1;
}
[EDIT] Je fais des test pour déterminer la valeur réelle de tout ça.
Par Jedaï le 14/1/2003 à 20:59:06 (#3021901)
[list=1]
*Ma fonction marche bien (dans les cas normaux en tous cas) ;)
*Il est impossible de diviser un entier par un entier puis de le mettre dans un float, bien que ce soit possible si l'on divise un entier par un float. Par ailleurs float f = 1 / 5.0; donne bien f == 0.2(000006); (les erreurs de décimales sont inévitables). Je vous donne donc la correction de ma fonction Div en dessous.
[/list=1]
//Mini biblio de math ;-)
//Jedai
//Ceil retourne l'entier immédiatement supérieur à f :
int Ceil(float f);
//Div fait la division de deux entier et renvoit l'entier immédiatement supérieur au résultat :
int Div(int n1, int n2);
int Div(int n1, int n2)
{
float f = n1 / IntToFloat(n2);
return Ceil(f);
}
int Ceil(float f)
{
int n = FloatToInt(f);
if (f == IntToFloat(n))
return n;
return n+1;
}
Par Skanzo Sylan le 14/1/2003 à 21:02:55 (#3021932)
return n;
return n+1;
Je comprend pô trop pourquoi tu ne met pô de "else"... À moins que le "return" stoppe complétement la lecture de la suite de la fonction...
Par Jedaï le 14/1/2003 à 21:16:09 (#3022035)
return met fin à l'exécution d'une fonction, d'ailleurs s'il t'arrive d'avoir un script gigantesque avec un if gigantesque du genre :
void main()
{
//plein de code à exécuter tout le temps
if(//blabla)
{
//un truc monstrueusement immense
}
}
Tu peux avoir meilleur jeu à mettre à la place :
void main()
{
//plein de code à exécuter tout le temps
if( ! //blabla)
return;
//un truc monstrueusement immense
}
Certaine fois ça peut éclaircir le code (pas tout le temps ! :mdr: ).
Par Skanzo Sylan le 14/1/2003 à 21:22:12 (#3022096)
Tous mes remerciements à Jedaï et RAT :merci:
(merci pour l'astuce du return, preuve que j'ai encore des efforts à faire dans la grammaire d'un script :))
Par coolstar le 15/1/2003 à 1:55:07 (#3024112)
JOL Archives 1.0.1
@ JOL / JeuxOnLine