Page 1 sur 2

Calculs erronés

Posté : 02 janv. 2011, 14:01
par Bosse.cie
Bonjour,

J'écris ici, non pas que je me sente très avancé en php, mais mon problème respire le truc vicieux.

Ce post fait suite à post345703.html#p345703.

Je résume "l'ancien problème" :
J'ai fait une série de logiciel pour la gestion de ma compagnie de théâtre. Ces logiciels fonctionnent très bien chez moi.
J'ai acheté une location chez ovh d'espace mutualisé (je recommande pas).
J'ai donc copié ma base de données chez eux, ainsi que mes logiciels.

1er problème : Mes données sauvegardés en utf8 n'arrivent pas en utf8 chez moi, mais en iso.
Réponse d'ovh : Il doit y avoir un problème d'encodage.

Devant tant de pertinence, je me suis débrouillé tout seul et fait systématiquement une requête "SET NAMES utf8" dès connexion à ma base; comme ça, je n'ai pas à attendre q'ovh règle le problème.

Du coup, mes données s'affichent bien.

Mais à partir de là, j'ai des erreurs.
Par exemple :
J'ai une page, où j'affiche une liste de personnes, avec noms et numéro de sécu pris dans une table de la base de données.Je sélectionne une personne.

A partir de là, je renvoie le numéro de sécu de la personne, pour effectuer un travail dessus.
Mais bien entendu, dans le script php, je fait un test sur la validité du numéro de sécu.
Parmis ces tests, l'un consiste à ôter la clé du numéro de sécu, envoyer ce numéro sans clé à une petite fonction (voir plus bas), qui renvoie la clé calculée. Si celle-ci est différente de la première, cela entraîne une erreur.


Or, cette fonction, que j'ai testé et re-testé chez moi das tous les sens et qui fonctionne très bien, ce retrouve à calculer des clés erroné chez ovh !

D'où cela peut-il venir ?
(configuration php chez ovh ?)

Comment puis-je espérer régler le problème sans compter sur l'aide si pertinente d'ovh ?


Voici la fonction; vous pouvez la tester, elle fonctionne.
function calcul_cle($numero) {
	if (strlen($numero)!=13)
		return -1;

	$corse=0;
	if ($numero{6}=="A"){ //le cas corse
		$numero{6} = "0";
		$corse=1000000;	
	} else if ($numero{6}=="B"){
		$corse=2000000;
		$numero{6} = "0";
	}

	$cle = 97 - (($numero-$corse)%97); //formule de calcul de cle sécu
	if ($cle < 10)
		$cle = "0".$cle;
	return $cle;
}
Je rappelle qu'elle me renvoie bien une clé, mais fausse ! (souvent une clé à trois chiffres au lieu d'un ou deux chiffres.)


Merci

Re: Calculs erronés

Posté : 02 janv. 2011, 15:48
par Bosse.cie
Pour faire avancer le lourrin :

J'ai fait à partir du précédent ce petit bout de code, que j'ai mis chez moi en local, et sur ovh :
Le code :
<?php
	
	$numero="1630269385312";
	$corse=0;
	if ($numero{6}=="A"){ //le cas corse
		$numero{6} = "0";
		$corse=1000000;	
	} else if ($numero{6}=="B"){
		$corse=2000000;
		$numero{6} = "0";
	}

echo ("Numéro avant calcul : -".$numero."-<br />");
	$cle = 97 - (($numero-$corse)%97); //formule de calcul de cle sécu
echo ("Clé calculée : -".$cle."-<br />"); 

$interm = $numero;
echo ("interm=".$interm."<br />");//affiche : local et ovh : 1630269385312
$interm = $numero-$corse;
echo ("interm après corse=".$interm."<br />");//affiche : local et ovh : 1630269385312
$interm = $interm%97;
echo ("interm après modulo=".$interm."<br />"); //affiche : local : 49, ovh : -59
$interm = 97-$interm;
echo("interm fin=".$interm."<br/>"); //affiche : local : 48, ovh : 156
?>
J'ai mis en commentaires la différence entre ovh et local.
C'est au niveau de l'opérateur modulo qu'il y a un problème.

Une idée ?

Moi je nage.

Re: Calculs erronés

Posté : 03 janv. 2011, 02:13
par devlop78
Effectivement, lorsque je calcule sur papier la division, j'obtiens un reste de 49.

Je crois (mais il est tard), que le chiffre 1630269385312 n'est pas un integer (trop long) et devient donc un float. A voir donc s'il s'agit d'un problème de limite de précision de la virgule, ou dans l'opération binaire que l'ordinateur effectue (voir le post d'il n'y a pas si longtemps sur 4.7). Dans les deux cas, je trouve qu'un modulo négatif est plutôt bizarre ...
on écrira a mod n pour représenter le reste dans {0, ..., n−1} de la division de a par n

Wikipedia
De plus, Wikipedia n'a pas l'air de me contredire (le modulo est bien supérieur ou égal à 0).

Cela dit, je suis le post car PHP semble montrer des réactions face aux calculs plutôt inattendues, quoique forcément logique puisque venant d'un ordinateur ...

Désolé, je pouvais t'aider sur l'autre post, là, je mériterais bien des cours (mais pas en mathématiques, je me suis surpris à bien réussir cette petite division euclidienne ;o)

Re: Calculs erronés

Posté : 03 janv. 2011, 13:28
par Bosse.cie
Merci quand même. Ce que je trouve bizarre, c'est que chez moi, cela fonctionne très bien.

Et si le problème vient de là (j'y avais un peu pensé pour être franc, mais vu que ça marche chez moi, j'en reviens toujours à ça),il y a un truc qui m'échappe.
Mais du coup, je suis complètement bloqué.

Re: Calculs erronés

Posté : 03 janv. 2011, 16:02
par telnes
chez moi
Numéro avant calcul : -1630269385312-
Clé calculée : -156-
interm=1630269385312
interm après corse=1630269385312
interm après modulo=-59
interm fin=156
php 5.2.x

par ici il y a de l'info http://fr.wikipedia.org/wiki/Modulo_(informatique)

en utilisant ca
function modulo($a, $b) {

	return $a - $b * floor($a/$b);

}
ca donne

echo modulo($numero,97); // =>49 :)

++

Re: Calculs erronés

Posté : 04 janv. 2011, 01:43
par Bosse.cie
En effet, ça marche aussi... de la même manière.

C'est à dire que sur ovh, j'obtiens le même résultat faux.


Merci quand même.


Une autre idée ?

Je dois avouer que ça commence à urger.


PS : Le lien ne fonctionne pas.

Re: Calculs erronés

Posté : 04 janv. 2011, 11:45
par Spols
function modulo($a, $b) {

	return $a - $b * floor($a/$b);

}
Si ce code ne fonctionne pas non plus chez OVH, tu as une piste, c'est donc la fonction floor() qui bug

Re: Calculs erronés

Posté : 04 janv. 2011, 20:34
par devlop78
C'est déjà honteux d'avoir une fonction floor(). Ca veut rien dire ! Un petit Math::floor() serait tellement plus logique :p

Moi, j'dis ça, j'dis rien !

:p a++

Re: Calculs erronés

Posté : 04 janv. 2011, 22:29
par stealth35
C'est déjà honteux d'avoir une fonction floor(). Ca veut rien dire ! Un petit Math::floor() serait tellement plus logique :p

Moi, j'dis ça, j'dis rien !

:p a++
$a = 3.3;
$js = new JSContext();

$js->assign('a', $a);

$script = <<<END
  return Math.floor(a);
END;

echo $js->evaluateScript($script);
:mrgreen:

Re: Calculs erronés

Posté : 05 janv. 2011, 01:27
par devlop78
Bah c'est vrai ça, je trouve que les fonctions php sont trop éparpillées. On devrait avoir String.xxxx (comme String.strlen() etc), PDO (c'est déjà le cas ;p), etc. Chacun son boulot, non mais ho !

"Bienvenue !!!"::toUpper()::substr(0,-2);

Re: Calculs erronés

Posté : 05 janv. 2011, 01:35
par stealth35
Bah c'est vrai ça, je trouve que les fonctions php sont trop éparpillées. On devrait avoir String.xxxx (comme String.strlen() etc), PDO (c'est déjà le cas ;p), etc. Chacun son boulot, non mais ho !

"Bienvenue !!!"::toUpper()::substr(0,-2);
ouai du full object à la ruby ducoup :wink:

ps : ce que je t'ai montré ca existe vraiment c'est avec l'extension spidermonkey :mrgreen:

Re: Calculs erronés

Posté : 05 janv. 2011, 01:56
par devlop78
Bah c'est vrai ça, je trouve que les fonctions php sont trop éparpillées. On devrait avoir String.xxxx (comme String.strlen() etc), PDO (c'est déjà le cas ;p), etc. Chacun son boulot, non mais ho !

"Bienvenue !!!"::toUpper()::substr(0,-2);
ouai du full object à la ruby ducoup :wink:

ps : ce que je t'ai montré ca existe vraiment c'est avec l'extension spidermonkey :mrgreen:
Oui je connaissais déjà (même si jamais essayé), mais je ne vois pas trop l'intérêt. Surtout que JavaScript n'est pas full object, et qu'en terme de typage (et autres d'ailleurs), il est loin d'être une référence ... Perso, je reste toujours sur un langage que j'ai pu découvrir ... :D

String Stealth = "stealth35 va bien";
try {
System.io.echo Stealth.replace ("stealth", "devlop78");
} catch (Exception e) {
System.io.echo "Nous allons mal";
}

Re: Calculs erronés

Posté : 05 janv. 2011, 01:56
par devlop78
Bah c'est vrai ça, je trouve que les fonctions php sont trop éparpillées. On devrait avoir String.xxxx (comme String.strlen() etc), PDO (c'est déjà le cas ;p), etc. Chacun son boulot, non mais ho !

"Bienvenue !!!"::toUpper()::substr(0,-2);
ouai du full object à la ruby ducoup :wink:

ps : ce que je t'ai montré ca existe vraiment c'est avec l'extension spidermonkey :mrgreen:
Ruby sur l'ongle ??? :shock:

Re: Calculs erronés

Posté : 05 janv. 2011, 13:10
par Bosse.cie
Excusez de déranger là, rien contre le délire; mais si on pouvait revenir un chouïa à mon problème, et à sa résolution, ça m'arrangerait là.

Merci.

Re: Calculs erronés

Posté : 05 janv. 2011, 14:15
par stealth35
avec ton premier code j'ai

Numéro avant calcul : -1630269385312-
Clé calculée : -156-
interm=1630269385312
interm après corse=1630269385312
interm après modulo=-59
interm fin=156

mais devlop78 t'as répondu, tu bosses avec des chiffres trop grand utilise bc_math