Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Newbie] Nombre de décimales et réinitialisation d'une table de hashage

10 réponses
Avatar
lesouriciergris
2 questions bêtes mais les solutions auxquelles je pense ne me semble
pas très glorieuses :

1) Comment fixer le nombre de décimales d'un nombre à 2 ?
Solution envisagée : RegEx !

2) Comment réinitialiser complètement une table de hashage ?
Solution envisageable : delete de chaque elt !

Merci

10 réponses

Avatar
Mathieu Arnold
écrivait:
2 questions bêtes mais les solutions auxquelles je pense ne me semble
pas très glorieuses :

1) Comment fixer le nombre de décimales d'un nombre à 2 ?
Solution envisagée : RegEx !


$nombre = int($nombre * 100) / 100;

2) Comment réinitialiser complètement une table de hashage ?
Solution envisageable : delete de chaque elt !


%truc = undef;

--
Mathieu Arnold

Avatar
GERBIER Eric
wrote:
2 questions bêtes mais les solutions auxquelles je pense ne me semble
pas très glorieuses :

1) Comment fixer le nombre de décimales d'un nombre à 2 ?
Solution envisagée : RegEx !


je verrais bien un arrondi a base de int :
int($nb * 100) / 100

2) Comment réinitialiser complètement une table de hashage ?
Solution envisageable : delete de chaque elt !


%table = ();

Avatar
lesouriciergris
Mathieu Arnold wrote:
écrivait:

2 questions bêtes mais les solutions auxquelles je pense ne me semble
pas très glorieuses :

1) Comment fixer le nombre de décimales d'un nombre à 2 ?
Solution envisagée : RegEx !



$nombre = int($nombre * 100) / 100;
Ouhais, je cherchais à savoir si comme dans bc, on pouvait fixer une

bonne fois pour toute le nombre de décimales dans les calculs ou comme
en C faire un printf bien câlé.


2) Comment réinitialiser complètement une table de hashage ?
Solution envisageable : delete de chaque elt !



%truc = undef;
Pour moi ça ne fonctionne pas :

my %toto;
$toto{1}="1";
%toto = undef;

Odd number of elements in hash assignment at ./essai.pl line 8.
Use of uninitialized value in list assignment at ./essai.pl line 8.





--
_@°> Eric BERTHOMIER / Le Sourcier Gris
http://lesouriciergris.free.fr http://troll.west.free.fr


Avatar
Paul Gaborit
À (at) Wed, 16 Feb 2005 10:38:11 +0100,
Mathieu Arnold <news+ écrivait (wrote):
écrivait:
2 questions bêtes mais les solutions auxquelles je pense ne me semble
pas très glorieuses :

1) Comment fixer le nombre de décimales d'un nombre à 2 ?
Solution envisagée : RegEx !


$nombre = int($nombre * 100) / 100;


ou :

$nombre = sprintf("%.2f", $nombre);

2) Comment réinitialiser complètement une table de hashage ?
Solution envisageable : delete de chaque elt !


%truc = undef;


ou :

%truc = ();

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>


Avatar
lesouriciergris
Paul Gaborit wrote:
À (at) Wed, 16 Feb 2005 10:38:11 +0100,
Mathieu Arnold <news+ écrivait (wrote):

écrivait:

2 questions bêtes mais les solutions auxquelles je pense ne me semble
pas très glorieuses :

1) Comment fixer le nombre de décimales d'un nombre à 2 ?
Solution envisagée : RegEx !


$nombre = int($nombre * 100) / 100;



ou :

$nombre = sprintf("%.2f", $nombre);
Oui j'avais oublié que le PERL avait repris tout le bon du C



2) Comment réinitialiser complètement une table de hashage ?
Solution envisageable : delete de chaque elt !


%truc = undef;



ou :

%truc = ();
En effet cette syntaxe permet de ne pas avoir de Warning.


Merci




Avatar
Mathieu Arnold
écrivait:
Mathieu Arnold wrote:
%truc = undef;


Pour moi ça ne fonctionne pas :
my %toto;
$toto{1}="1";
%toto = undef;

Odd number of elements in hash assignment at ./essai.pl line 8.
Use of uninitialized value in list assignment at ./essai.pl line 8.


Vouy, undef %toto; c'est mieux :-)

--
Mathieu Arnold


Avatar
Mathieu Arnold
Paul Gaborit écrivait:
À (at) Wed, 16 Feb 2005 10:38:11 +0100,
Mathieu Arnold <news+ écrivait (wrote):
écrivait:
1) Comment fixer le nombre de décimales d'un nombre à 2 ?
Solution envisagée : RegEx !
$nombre = int($nombre * 100) / 100;

$nombre = sprintf("%.2f", $nombre);



ça ne risque pas d'être plus lent ?

2) Comment réinitialiser complètement une table de hashage ?
Solution envisageable : delete de chaque elt !


%truc = undef;
%truc = ();



J'avais oublié que undef %truc; et %truc = (); ont le même effet.

--
Mathieu Arnold



Avatar
Paul Gaborit
À (at) Wed, 16 Feb 2005 11:51:50 +0100,
Mathieu Arnold <news+ écrivait (wrote):
$nombre = int($nombre * 100) / 100;
$nombre = sprintf("%.2f", $nombre);



ça ne risque pas d'être plus lent ?


Si, ça risque... mais ça donne le bon résultat à tous les coups. De plus,
l'arrondi est correctement calculé.

Ex:

foreach my $x (10.04, 11111111111111.04) {
my $x1 = int($x*100)/100;
my $x2 = sprintf("%.2f", $x);
print "$x $x1 $x2n";
}

(Le résultat peut dépendre de la précision de votre machine.)

C'est donc la bonne méthode pour de l'affichage. Maintenant si c'est pour du
calcul, il vaudrait mieux spécifier la méthode d'arrondi choisie (voire même
calculer directement en entier, l'unité interne représentant alors les
centièmes externes).

J'avais oublié que undef %truc; et %truc = (); ont le même effet.


Je préfère la seconde écriture car elle a le mérite d'être utilisable pour
toutes les initialisations de tables de hachages (qu'elles soient vides ou
non).

--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>



Avatar
Isammoc
$nombre = int($nombre * 100) / 100;
$nombre = sprintf("%.2f", $nombre);



ça ne risque pas d'être plus lent ?


Si, ça risque... mais ça donne le bon résultat à tous les coups. De
plus, l'arrondi est correctement calculé.


Euh, c'est la troncature, ca non?
perso, j'aurais dit:

$nombre = int($nombre * 100 + .5) / 100;

--
Isammoc




Avatar
Paul Gaborit
À (at) 16 Feb 2005 13:42:15 GMT,
Isammoc <Isammoc.jeux(no-spam)@free.fr> écrivait (wrote):
$nombre = int($nombre * 100) / 100;
$nombre = sprintf("%.2f", $nombre);



ça ne risque pas d'être plus lent ?


Si, ça risque... mais ça donne le bon résultat à tous les coups. De
plus, l'arrondi est correctement calculé.


Euh, c'est la troncature, ca non?
perso, j'aurais dit:

$nombre = int($nombre * 100 + .5) / 100;


La troncature est une méthode d'arrondi (et c'est effectivement ce que fait la
première méthode: on arrondit vers l'entier inférieur).

Votre proposition est une seconde méthode d'arrondi. Mais il existe d'autres
méthodes d'arrondi. 'sprintf' utilise sa propre méthode (en raisonnant sur la
représentation décimale de la valeur).

Par exemple, en supposant qu'on cherche un entier, comment faut-il arrondir
2.49 ? Certains proposent cela :

2.49 -> 2.5 -> 3 (en fait, on fait un arrondi décimale par décimale).

On peut aussi arrondir à l'entier supérieur.

En fait, la méthode choisie dépend du contexte. Dans un contexte
financier/fiscal, c'est la loi qui fixe la méthode. Par exemple pour le calcul
de la TVA ou pour les conversions monétaires...


--
Paul Gaborit - <http://www.enstimac.fr/~gaborit/>
Perl en français - <http://www.enstimac.fr/Perl/>