Comment puis-je arrondir les éléments dans un tableau Perl à seulement deux décimales?

StackOverflow https://stackoverflow.com/questions/3992035

Question

J'ai un tableau avec quelques éléments:

  

MSN = 34,3433423432434%

     

Chrome = 12,4343434353534%

     

Gtalk = 32,23233543543532%   ...

Et je passe ce tableau comme les étiquettes y-axe à utiliser avec un module appelé GD :: Graph . Le problème que je suis confronté en ce moment, est que le nombre est si grand sur le graphique qui se chevauchent avec l'entrée adjacente et le rendre illisible.

Y at-il un moyen où je peux arrondir tous les éléments dans un tableau à seulement 2 décimales? Et faire xx.xx%?

En outre, toute personne utilisant GD avec familar :: Graph, savez-vous comment puis-je augmenter le texte de taille sur le graphique? Je peux augmenter la taille Titre / Legend fin, mais le texte réel dans « Gtalk » ou '32% ,23233543543532 » est vraiment petit et j'ai essayé beaucoup des commandes http://search.cpan.org/dist/GDGraph/Graph.pm , mais ils ne semblent pas travailler pour moi!

Était-ce utile?

La solution

#!/usr/bin/perl

use strict; use warnings;
use YAML;

my %x = (
    MSN => '34.3433423432434%',
    Chrome => '12.4343434353534%',
    Gtalk => '32.23233543543532%',
);

for my $x ( values %x ) {
    $x =~ s/^(\d+\.\d+)%\z/ sprintf '%.2f%%', $1/e;
}

print Dump \%x;

Sortie:

Chrome: 12.43%
Gtalk: 32.23%
MSN: 34.34%

Si vous voulez extraire des valeurs dans un ordre spécifique, utilisez une tranche de hachage:

print "@x{ qw( MSN Chrome Gtalk ) }\n";

ou, si vous voulez juste des clés et des valeurs à la ligne dans l'appel plot:

my $gd = $graph->plot([
    [ keys %x ],
    [ @x{ keys %x } ],
]) or die $graph->error;

Remarque: Pour augmenter la taille du texte sur un GD::Graph, utilisez une police plus grande pour l'élément. Voir Méthodes pour les graphiques avec des axes .

En utilisant GD::Graph, vous devriez vraiment pas avoir à modifier les valeurs vous-même. Il suffit de fournir la chaîne '.2f%%' comme argument de y_number_format.

Autres conseils

De perlfaq4 'réponse Est-ce que Perl a une fonction round ()? Qu'en est-Ceil () et le plancher ()? fonctions trigonométriques? :


Rappelez-vous que int () ne fait que tronquer vers 0. Pour arrondir à un certain nombre de chiffres, sprintf () ou printf () est généralement la voie la plus facile.

printf("%.3f", 3.1415926535);   # prints 3.142

Le module POSIX (partie de la distribution standard de Perl) implémente ceil (), floor (), et un certain nombre d'autres fonctions mathématiques et trigonométriques.

use POSIX;
$ceil   = ceil(3.5);   # 4
$floor  = floor(3.5);  # 3

5,003 à 5,000 Perls, trigonométrie a été fait dans le module Math :: Complex. Avec 5.004, le module Math :: Trig (partie de la distribution standard de Perl) implémente les fonctions trigonométriques. En interne, il utilise le module Math :: Complex et certaines fonctions peuvent sortir de l'axe réel dans le plan complexe, par exemple le sinus inverse de 2.

Arrondir dans les applications financières peuvent avoir des conséquences graves, et la méthode utilisée se doit d'être spécifiée précisément. Dans ces cas, il vaut probablement ne pas faire confiance l'arrondissement du système est utilisé par Perl, mais plutôt d'implémenter la fonction d'arrondi que vous vous avez besoin.

Pour voir pourquoi, remarquez comment vous avez encore un problème sur l'alternance à mi-chemin point:

for ($i = 0; $i < 1.01; $i += 0.05) { printf "%.1f ",$i}

0.0 0.1 0.1 0.2 0.2 0.2 0.3 0.3 0.4 0.4 0.5 0.5 0.6 0.7 0.7
0.8 0.8 0.9 0.9 1.0 1.0

Ne pas blâmer Perl. Il est le même que dans C. IEEE dit que nous devons faire. en Perl, dont les valeurs absolues sont des nombres entiers de moins de 2 ** 31 (sur 32 machines de bits) fonctionneront comme des entiers mathématiques. D'autres numéros ne sont pas garantis.

http://search.cpan.org/dist/Math-Round/ Round.pm

Math :: ronde aussi des merveilles. Vous pouvez transmettre un scalaire ou une liste.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top