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

JavaScript Discussion :

Comportement étrange des Modulos


Sujet :

JavaScript

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Par défaut Comportement étrange des Modulos
    Bonjour a tous,

    Je tiens tout d'abord a remercier la communauté de developper.net, pour toute l'aide que vous m'avez apporté a chacun de mes soucis. Je n'ai jusqu'a présent jamais eu a m'inscrire du fait que mes soucis eu été résolu grace aux posts deja existants.

    Pouvoir soulever un bug qui n'etait pas traité a donc ete pour moi d'une grande jouissance (ou pas), et l'incomprehension qui la genere m'exalte (ou pas²)

    Voici donc mon soucis :

    J'ai un formulaire tout ce qu'il y a de plus banal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    						<label for="min">MIN<font color="red">*</font></label>
    						<input type="text" name="min" size="4"onblur="verifMin(this)"/>
     
    						<label for="iopcc">IOPCC<font color="red">*</font></label>
    						<input type="text" name="iopcc" size="4"onblur="verifRest(this)"/>
     
    <label for="max">MAX<font color="red">*</font></label>
    						<input type="text" name="max" size="4" onblur="verifMax(this)"/>
    et des verifs, tout aussi banales...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    function verifMin(champ)
    {
    	var champs = (champ.value).replace(",",".");
    	var min = parseFloat(champ.value);
    	var mina = min % 0.1 ;
    	if(isNaN(min) || min < 0 || min > 8 || mina != 0)
    	{
    		surligne(champ, true);
    		return false ;
    	}
    	else
    	{
    		surligne(champ, false);
    		return true ;
    	}
    }
     
    function verifMax(champ)
    {
    	var champs = (champ.value).replace(",",".");
    	var max = parseFloat(champs);
    	var maxa = max % 0.1 ;
    	if(isNaN(max) || max < 1 || max > 8 || maxa != 0)
    	{
    		surligne(champ, true);
    		return false ;
    	}
    	else
    	{
    		surligne(champ, false);
    		return true ;
    	}
    }
     
    function verifRest(champ)
    {
    	var champs = (champ.value).replace(",",".");
    	var rest = parseFloat(champs);
    	var resta = rest % 0.1 ;
    	if(isNaN(rest) || rest < 5 || rest > 30 || resta != 0)
    	{
    		surligne(champ, true);
    		return false ;
    	}
    	else
    	{
    		surligne(champ, false);
    		return true ;
    	}
    }
    Ces 3 fonctions se comportent de la meme maniere (et la fonction surligne ne comporte aucun accrochage). Mon soucis cependant, se porte au niveau du modulo... Un 5 % 0.1 me renvoit 0.99999967, un 0.1 % 0.1 me renvoit 2.xxxxxxxExx
    etc etc.

    J'ai cherché dans deux trois endroits, l'operande qui prend que les entiers toussa toussa, mais n'ai pas eu satisfaction de cette reponse pour la simple et "mauvaise" raison qu'un modulo 0.25 fonctionne normalement (puisque j'en ai dans mon formulaire...)

    Je vous avoue que j'ai un peu de mal a comprendre d'ou vient le soucis, et avoir la tete dans le code doit pas aider, mais je cale totalement :s

  2. #2
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    Etrange ?
    Non c'est juste dû à la virgule flottante, comme dans de nombreux langages ..
    Un désormais classique ici...
    http://www.developpez.net/forums/d12...bre-incorrect/

    Je te propose une petite fonction pour y remédier ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function RoundModulo(a,b){
    	if(b==parseInt(b,10) ){ return a%b; }
    	else{
    		tabpow=(b.toString().split('.'))
    		if(tabpow.length==1){
    			return a%tabpow[0]}
    		else{
    			pow=Math.pow(10,tabpow[1].length);
    			return Math.round(((a*pow) % (b*pow))/pow  ,0);
    			}
    	}
    }
     
    alert(RoundModulo(5 ,2.50))
    On pourrait tout aussi bien faire un parseInt sur le résultat direct, mais mathématiquement c'est plus smart d'éléver aux puissances de 10
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Par défaut
    Merci beaucoup

    J'ai réglé ca cette nuit en multipliant mes valeurs par 1000 (j'avais encore le soucis sur certains nombres par la multiplication par 100).
    Bref du bricolage mais qui avait au moins le mérite de fonctionner

    Pour le coup j'vais changer ça avec cette fonction. Merci bien !

    PS : Pour le coup si j'ai pas trouvé réponse ici a la base c’était parce que ma question était mal formulée

    PS2 : Beaucoup de langages, surement, mais bizarrement j'ai jamais eu ce soucis que ce soit en Java ou en Php d’où le fait que j'sois tombé dénue devant ça.

  4. #4
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Billets dans le blog
    20
    Par défaut
    j'ai jamais eu ce soucis que ce soit en Java ou en Php
    Et pourtant :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?php
    echo (0.1+0.7)*10;
    echo '<br>';
    echo floor((0.1+0.7)*10);


    Voir : Nombres décimaux
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  5. #5
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    @Spacefrog: tu mutliplies de flotants et puis tu redivises le résultat final, 2 sources d'erreurs possibles sur les flotants, tu résouds peut-être le problème pour la valeur "2.50" mais je suis prêt à parier que pour d'autres valeurs ta solutions bug tout autant.

    @Canabal: de même pour toi, tu dis qu'avec une multiplication par 100 certains bugs persistent alors tu multiplies par 1000... ce raisonnement est pour le moins douteux, et je suis convaincu que pour certaines valeurs tu auras aussi des bugs. et ce même en multipliant par 10^6.

  6. #6
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Je sais que c'est marqué comme résolu, mais voici un code (non optimisé) qui devrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    function Integer(value){
    	if(!(this instanceof Integer)){
    		return new Integer(value);
    	}
    	if(value instanceof Integer){
    		return value;
    	}
    	var a = this;
    	a.originalString = parseFloat(value).toString();
    	a.pow = a.originalString.indexOf('.');
    	if(a.pow == -1){
    		a.pow = a.originalString.length;
    	}
    	a.data = a.originalString.replace('.','').split('').map(function(a){return parseInt(a)});
    	a.negatif = 0;
    	if(isNaN(a.data[0])){
    		a.data.shift();
    		a.pow--;
    		a.negatif = 1;
    	}
    	return a;
    }
    Integer.prototype.sub = function(value){
    	return this.add(value,true);
    };
    Integer.prototype.set = function(data,pow,neg){ 
    	var a = this;
    	a.data = data || [0];
    	a.pow = pow || 1;
    	a.negatif = neg || 0;
    	return a;
    };
    Integer.prototype.add = function(value,sub){
    	var a = this, b = Integer(value),
    		sa = a.negatif, sb = b.negatif,
    		da = a.data, db = b.data,
    		la = da.length, lb = db.length,
    		pa = a.pow, pb = b.pow,
    		pdiff = pb - pa,
    		i, compare = a.compare(b);
     
    	if(sub){
    		sb++;
    	}
    	if(compare==0 && (sa%2)!=(sb%2) ){
    		// soustraction lui-même ou même valeur -> return 0
    		return a.set();
    	}
    	if(pdiff>0){ 
    		// copy prefix from b
    		var prefix = db.slice(0, pdiff);
    		prefix.unshift(0,0);
    		Array.prototype.splice.apply(da, prefix);
    	}
    	if(la < lb){ 
    		// copy sufix from b
    		var sufix = db.slice(la-lb);
    		sufix.unshift(la+1,0);
    		Array.prototype.splice.apply(da, sufix);
    	}
    	if(compare==-1){
    		a.negatif=sb;
    	}
    	else{
    	}
    	for(i=0;i<la && Math.abs(pdiff)+i<da.length;i++){
    		// add/sub all commun field
    		if(sa%2 == sb%2){
    			da[Math.abs(pdiff)+i] += db[Math.max(pdiff,0)+i] || 0;
    		}
    		else if(a.negatif%2 == sa%2){
    			da[Math.abs(pdiff)+i] -= db[Math.max(pdiff,0)+i] || 0;
    		}
    		else{
    			da[Math.abs(pdiff)+i] = (db[Math.max(pdiff,0)+i] || 0) - da[Math.abs(pdiff)+i];
    		}
    	}
     
    	// set bigger pow
    	a.pow = Math.max(pa,pb);
    	// return fixed values
    	return a.fix();
    };
    Integer.prototype.fix = function(){
    	var a = this, da = a.data;
    	for(i=da.length-1;i>0;i--){
    		if(da[i]>=10){
    			da[i] -= 10;
    			da[i-1]++;
    		}
    		else if(da[i]<0){
    			da[i] += 10;
    			da[i-1]--;
    		}
    	}
    	if(da[0]>=10){
    		da[0] -= 10;
    		da.unshift(1);
    		a.pow++;
    	}
    	if(da[0]<-9){
    		da[0] += 10;
    		da.unshift(-1);
    		a.pow++;
    	}
    	if(da[0]<0){
    		da[0] = Math.abs(da[0]);
    		a.negatif++;
    	}
    	return a;
    };
    Integer.prototype.compare = function(value){
    	var a = this, b = Integer(value), i = 0;
    	if(a==b){
    		return 0;
    	}
    	if(a.pow > b.pow){
    		return 1;
    	}
    	if(a.pow < b.pow){
    		return -1;
    	}
    	var len = Math.max(a.data.length,b.data.length);
    	for(; a.data[i] == b.data[i] && i<len;i++);
    	if(a.data[i] > b.data[i] || b.data[i] == undefined){
    		return 1;
    	}
    	if(a.data[i] < b.data[i] || a.data[i] == undefined){
    		return -1;
    	}
    	return 0;
    };
    Integer.prototype.copy = function(){
    	var a = this;
    	return Integer().set(a.data,a.pow,a.negatif);
    };
    Integer.prototype.mod = function(value){
    	var a = this, b = Integer(value).copy(), neg = a.negatif;
    	b.negatif = 0;
    	a.negatif = 0;
    	while(a>b){
    		this.sub(b);
    	}
    	a.negatif = neg;
    	return a;
    };
    Integer.prototype.toString = function(){
    	var c = this.data.slice(0);
    	c.splice(this.pow,0,'.');
    	return parseFloat((this.negatif%2?'-':'')+c.join(''));
    };
     
     
     
     
    writeln = function(){
    	var a = Array.prototype.slice.call(arguments);
    	a.push('<br/>');
    	document.writeln.apply(document,a);
    };
     
     
    var a = -12.311111, b = -12.121111;
    writeln( Integer(a).sub(b) );
    writeln( a - b );
    writeln();
    writeln( Integer(5.0).mod(.1) );
    writeln( 5.0%.1 );
    Je n'ai implémenté que l'addition et la soustraction, ce qui fait que pour mon modulo, c'est une simple boucle non optimisé, la version optimisée devrait utiliser l'algorithme d'euclide, et donc les puissances et donc la multiplication optimisée. Mais en attendant, ça te garanti le bon résultat.

    edit: correction de la méthode "compare".

    Note: donc pour le modulo comme je l'ai expliqué, évite d'avoir un trop grand rapport a/b>10^6 pour l'opération a mod b; et pour les autres nombres essaye aussi de garder de petites valeurs sinon tu risques de sortir du rang de la représentations de celles-ci, + ou - compris entre 10^11 et son homologue négatif.

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Par défaut
    Citation Envoyé par Willpower Voir le message
    @Spacefrog: tu mutliplies de flotants et puis tu redivises le résultat final, 2 sources d'erreurs possibles sur les flotants, tu résouds peut-être le problème pour la valeur "2.50" mais je suis prêt à parier que pour d'autres valeurs ta solutions bug tout autant.

    @Canabal: de même pour toi, tu dis qu'avec une multiplication par 100 certains bugs persistent alors tu multiplies par 1000... ce raisonnement est pour le moins douteux, et je suis convaincu que pour certaines valeurs tu auras aussi des bugs. et ce même en multipliant par 10^6.
    En effet, la multiplication par 1000 est du pur bricolage, mais pour le coup, ça marchait bel et bien pour mon encadrement.
    Ceci étant je vais étudier ta fonction et l’insérer si besoin est. Merci beaucoup en tout cas

    PS : Pour l'instant, la formule de SpaceFrog ne m'a donné aucun résultat erroné (certes j'ai pas testé toutes les valeurs)

  8. #8
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Citation Envoyé par Canabal Voir le message
    PS : Pour l'instant, la formule de SpaceFrog ne m'a donné aucun résultat erroné (certes j'ai pas testé toutes les valeurs)
    Je viens de la tester, et en fait, elle ne renvoit que des valeurs entières, or dans ton exemple de ton premier post, tu utilises des valeurs flottantes mais sans préciser si le résultat lui peut ou non être un nombre flottant ?

    Exemple: 2 % 0.3 = 0.2

    L'algorithme de spaceFrog te renvoit 0, donc ça dépend de tes attentes au niveau du type de résultat(entier ou flottant). ;-)



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    writeln( Integer(2.0).mod(.3) ); // methode de willpower -> 0.2
    writeln( RoundModulo(2.0,.3) ); // methode de spacefrog -> 0
    writeln( 2.0%.3 ); // usage normal -> 0.20000000000000007

  9. #9
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    ben en principe un modulo est un integer non ?
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  10. #10
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    Citation Envoyé par SpaceFrog Voir le message
    ben en principe un modulo est un integer non ?
    Je ne sais pas(c'est bien possible), mais vu que dans son exemple il fait un "5 % 0.2"; je m'étais dis qu'il était possible qu'il tombe sur des valeurs non-entières comme résultat.

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Par défaut
    @Willpower : Je viens de le tester plus en profondeur aussi suite a des modifs, et en effet ça merdouille sur mes attentes (honte a moi pour les tests d'hier d'ailleurs...)

    Je dois recevoir le résultat exact du modulo, donc je peux recevoir des nombres a virgule (c'est d'ailleurs "le but" puisque si le mod n'est pas égal a 0 alors la valeur est fausse)

    En clair, sur un 3.2 % 0.25 j'attends bien 0.2 et non 0, et sur 3 % 0.25 j'attends 0. Le concept étant de bloquer l'envoi du formulaire si la valeur en paramètre n'est pas dans le step attendu (0.1 ou 0.25 selon les champs).

    Du coup j'vais remodifier tout ça.

    EDIT : 1%.1 me renvoit 0.99999999995 avec ta fonction WillPower

  12. #12
    Rédacteur/Modérateur

    Avatar de SpaceFrog
    Homme Profil pro
    Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Inscrit en
    Mars 2002
    Messages
    39 658
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Développeur Web Php Mysql Html Javascript CSS Apache - Intégrateur - Bidouilleur SharePoint
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2002
    Messages : 39 658
    Billets dans le blog
    1
    Par défaut
    Heu le principe du modulo c'est pas le reste entier de la division ?

    Quel est le teste souhaité ???
    Ma page Developpez - Mon Blog Developpez
    Président du CCMPTP (Comité Contre le Mot "Problème" dans les Titres de Posts)
    Deux règles du succès: 1) Ne communiquez jamais à quelqu'un tout votre savoir...
    Votre post est résolu ? Alors n'oubliez pas le Tag

    Venez sur le Chat de Développez !

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 15
    Par défaut
    Test souhaité :
    Un utilisateur peu rentrer une valeur entre -X et +Y avec un pas de 0.Z (0.1 ou 0.25 dans mon cas selon les champs).

    Le test est de vérifier que ces champs remplis par l'utilisateur rentrent dans ces conditions (que les nombres pour le pas a 0.1 ne comportent pas de X.XA avec A>0 et pour ceux avec un pas a 0.25 ne soient que des nombres en X.0/X.25/X.5 ou X.75), sinon, l'input devient rouge et bloque le formulaire.

    Exemples :
    Pas 0.1 / 0<Value<1 => 0 / 0.1 / 0.2 / 0.3... / 1 OK mais 0.11 ou encore 0.37 NON OK

    Pas 0.25 / 0<Value<1 => 0 / 0.25 / 0.50 / 0.75 / 1 OK mais 0.35 ou encore 0.3 NON OK

    Pour moi le principe du modulo est "le reste de la division" (ex : 3.25 divisé par 2 = 1 reste 1.25 donc 3.25 mod 2 = 1.25)

    EDIT : Apport d'exemples concrets pour chaques cas.

  14. #14
    Membre Expert Avatar de Willpower
    Homme Profil pro
    sans emploi
    Inscrit en
    Décembre 2010
    Messages
    1 009
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : sans emploi

    Informations forums :
    Inscription : Décembre 2010
    Messages : 1 009
    Par défaut
    si tes valeurs sont max à 2 chiffres derrieres la virgules, alors tu n'as qu'a tout multiplier par 100, via les string et non les nombres (pour éviter les bugs de virgules flottantes).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function foisCent(float){
        return parseInt(float.toFixed(2).toString().replace('.',''),10);
    }
     
    function moduloFoisCent(a,b){
        return foisCent(a)%foisCent(b);
    }
     
    var OK = !moduloFoisCent(5,.2); // renvoit 0 (donc OK = vrai), si a est divisible par b
    alert(OK);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/06/2014, 09h44
  2. [XL-2007] Question aux Gurus d'Excel - Comportement étrange des liaisons
    Par Snimo dans le forum Excel
    Réponses: 0
    Dernier message: 17/01/2013, 19h19
  3. [AppleScript] Comportement étrange des "if" juste après compilation
    Par Flore22 dans le forum AppleScript
    Réponses: 0
    Dernier message: 23/04/2010, 08h48
  4. Comportement étrange des layouts
    Par CP / M dans le forum Qt
    Réponses: 3
    Dernier message: 13/07/2009, 11h59
  5. Réponses: 2
    Dernier message: 22/09/2003, 11h23

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