Bienvenue sur JeuxOnLine - MMO, MMORPG et MOBA !
Les sites de JeuxOnLine...
 

Panneau de contrôle

Recherche | Retour aux forums

JOL Archives

Arrondir une variable...

Par Skanzo Sylan le 14/1/2003 à 19:17:24 (#3020981)

Kikoo :)

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)

C'est normal, c'est la propriété du type int.

Pour avoir une virgule il faut un float, une variable flottante.

un peu plus de détail

Par Skanzo Sylan le 14/1/2003 à 20:20:36 (#3021504)

Oui j'imagine bien que j'aurais besoin de float, mais même avec ça je ne voie pô trop comment arriver à arrondir mes variables.

Merci kan même d'avoir essayé :)

Par Jedaï le 14/1/2003 à 20:22:26 (#3021519)

:mdr:

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)

Va essayer, merci Jed! :p

Par RAT le 14/1/2003 à 20:30:22 (#3021594)

hmmmm , le moyen est assez simple à mon avis.

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)

arff oui j'ai pas pensé par manque de temps qu'à l'inverse cela serait plus rapide.

Bon je pense que celui de jedaï est mieux :)

Par Jedaï le 14/1/2003 à 20:34:19 (#3021640)

Désolé, ce script ne compile pas !

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)

Héhé, c'est en effet assez simple.

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)

Bien sûr, il suffit de la prototyper au tout début de ton include :


//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)

Après vérification :

[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)

if (f == IntToFloat(n))
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)

C'est exactement ça !:p

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)

Bon ben ça marche impeccablement :)

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)

CHAPEAU à vous Tous pour ces Démonstratives Leçons!!! :merci: :merci: :merci:

JOL Archives 1.0.1
@ JOL / JeuxOnLine