Comment puis-je configurer la précision en virgule flottante en Perl?
-
12-09-2019 - |
Question
Y at-il un moyen de définir la précision en virgule flottante (à 3 chiffres) d'un script Perl, sans avoir à changer spécifiquement pour chaque variable?
Quelque chose de semblable à TCL de:
global tcl_precision
set tcl_precision 3
La solution
Il n'y a aucun moyen de modifier globalement cela.
S'il est juste à des fins d'affichage puis utilisez sprintf("%.3f", $value);
.
Pour des raisons mathématiques, utilisez (int(($value * 1000.0) + 0.5) / 1000.0)
. Cela fonctionnerait pour les nombres positifs. Vous auriez besoin de changer pour travailler avec des nombres négatifs cependant.
Autres conseils
Utilisez Math::BigFloat
ou bignum
:
use Math::BigFloat;
Math::BigFloat->precision(-3);
my $x = Math::BigFloat->new(1.123566);
my $y = Math::BigFloat->new(3.333333);
Ou avec bignum
plutôt faire:
use bignum ( p => -3 );
my $x = 1.123566;
my $y = 3.333333;
Ensuite, dans les deux cas:
say $x; # => 1.124
say $y; # => 3.333
say $x + $y; # => 4.457
Je recommande de ne pas utiliser sprintf ( "%. 3F", valeur $).
S'il vous plaît regarder l'exemple suivant: (6,02 * 1,25 = 7,525)
printf("%.2f", 6.02 * 1.25) = 7.52
printf("%.2f", 7.525) = 7.53
Traiter le résultat comme une chaîne et utiliser substr
. Comme ceci:
$result = substr($result,0,3);
Si vous voulez faire l'arrondi, faites-le en tant que chaîne aussi. Procurez-vous le caractère suivant et décider.
Ou vous pouvez utiliser ce qui suit pour tronquer tout ce qui vient après le troisième chiffre après la virgule:
if ($val =~ m/([-]?[\d]*\.[\d]{3})/) {
$val = $1;
}