2009-12-03 5 views
13

Existe-t-il un moyen de définir la précision en virgule flottante d'un script Perl (à 3 chiffres), sans avoir à le modifier spécifiquement pour chaque variable?Comment définir la précision du nombre à virgule flottante en Perl?

Quelque chose de semblable à celui TCL:

global tcl_precision 
set tcl_precision 3 
+0

Voulez-vous que trois chiffres ou trois chiffres après la virgule? Il y a une différence :) –

+0

est-il un moyen de faire l'un d'eux? –

Répondre

12

Il n'y a aucun moyen de modifier globalement cela.

Si ce n'est que pour l'affichage, utilisez sprintf("%.3f", $value);.

À des fins mathématiques, utilisez (int(($value * 1000.0) + 0.5)/1000.0). Cela fonctionnerait pour les nombres positifs. Vous auriez besoin de le changer pour travailler avec des nombres négatifs cependant.

+1

Si c'est juste à des fins d'affichage alors définissez '$ # = '%. 3f'' - voir' perldoc perlvar' – mob

+0

'$ #' est supprimé dans Perl 5.10 :( – skaurus

+1

@ SinanÜnür non, vous ne pouvez pas! Exemple: 'perl -E '$ _ = 155; disons sprintf ("% 2f", $ _/1000); '' Devrait imprimer '0.16' mais imprime' 0.15'. (Voir: http://stackoverflow.com/q/24493228)/734304) – kobame

19

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 à la place faire:

use bignum (p => -3); 
my $x = 1.123566; 
my $y = 3.333333; 

Puis dans les deux cas:

say $x;  # => 1.124 
say $y;  # => 3.333 
say $x + $y; # => 4.457 
2

Je ne recommanderais pas d'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

1

Traiter le résultat comme une chaîne et utiliser substr. Comme ceci:

$result = substr($result,0,3); 

Si vous voulez arrondir, faites-le aussi sous forme de chaîne. Juste obtenir le prochain personnage et décider.

0

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; 
} 
Questions connexes