64 votes

Comment faire une division entière en Perl ?

Quelle est une bonne façon de toujours faire des divisions entières en Perl ?

Par exemple, je veux :

real / int = int

int / real = int

int / int = int

92voto

Michael Ratanapintha Points 11957

Le champ lexical integer pragma force Perl à utiliser l'arithmétique des nombres entiers dans sa portée :

print 3.0/2.1 . "\n";    # => 1.42857142857143
{
  use integer;
  print 3.0/2.1 . "\n";  # => 1
}
print 3.0/2.1 . "\n";    # => 1.42857142857143

1 votes

Info supplémentaire, les parenthèses séparent 'use integer' à l'intérieur du bloc, puis à l'extérieur du bloc, le calcul réel standard sera utilisé avant et après le bloc.

0 votes

Sans utiliser 'use integer', vous pouvez toujours écrire -1 & $x qui renvoie la valeur entière de $x ...

0 votes

@johannesvalks Cela transformera les entiers négatifs en nombres positifs à deux compléments, ce qui n'est probablement pas ce que vous vouliez. L'option " use integer " est également problématique, car elle est signé use integer a également un comportement défini par l'implémentation avec des entrées négatives sur les compilateurs C89. Le casting via int(a/b) sera erroné pour la plupart des grandes entrées. Obtenir des résultats cohérents pour toutes les entrées est vraiment dur.

51voto

Bryan Denny Points 12910

Vous pouvez couler des ints en Perl :

int(5/1.5) = 3;

9 votes

Oui, mais la division entière serait int(5) / int(1.5). Sinon, vous ne faites qu'arrondir la division réelle.

7 votes

Mais int(5) / int(1.5) != int

5 votes

Désolé, c'est ce que je demandais vraiment. Je voulais un résultat int après toute sorte de division. Donc oui, je cherchais un arrondi.

8voto

Steve Schaefer Points 21

int(x+.5) s'arrondiront positif vers le nombre entier le plus proche. Arrondir vers le haut est plus difficile.

Pour arrondir vers zéro :

int($x)

Pour les solutions ci-dessous, incluez l'énoncé suivant :

use POSIX;

Pour arrondir à la baisse : POSIX::floor($x)

Pour arrondir : POSIX::ceil($x)

Pour arrondir à partir de zéro : POSIX::floor($x) - int($x) + POSIX::ceil($x)

Pour arrondir à l'entier le plus proche : POSIX::floor($x+.5)

Notez que int($x+.5) échoue pour les valeurs négatives. int(-2.1+.5) es int(-1.6) qui est de -1.

4 votes

Non, int arrondit vers zéro, tandis que l'arrondi normal arrondit vers le pair. Exécuter perl -le 'printf "int(%s) is %d, round(%s) is %.0f;\n", ($_+0.5)x4 for -10..10' et vous verrez des choses comme int(-3.5) est -3, round(-3.5) est -4 ; int(-2.5) est -2, round(-2.5) est -2 ; int(-1.5) est -1, round(-1.5) est -2 ; int(-0.5) est 0, round(-0. 5) est -0 ; int(0.5) est 0, round(0.5) est 0 ; int(1.5) est 1, round(1.5) est 2 ; int(2.5) est 2, round(2.5) est 2 ; int(3.5) est 3, round(3.5) est 4 ; int(4.5) est 4, round(4.5) est 4 ;

0 votes

@tchrist En fait, l'arrondi normal se fait vers le plus proche ; seul le cas limite .5 s'arrondit vers le pair.

4voto

Znik Points 53

Vous pouvez :

use integer;

il est expliqué par Michael Ratanapintha ou bien utiliser manuellement :

$a=3.7;
$b=2.1;

$c=int(int($a)/int($b));

Remarquez que 'int' n'est pas un casting. C'est une fonction pour convertir un nombre en entier. C'est parce que Perl 5 n'a pas de division séparée des entiers. L'exception est lorsque vous utilisez 'integer'. Dans ce cas, vous perdrez la division réelle.

0voto

Manoj Kumar Points 11

J'espère que cela fonctionnera

int(9/4) = 2.

Merci Manojkumar

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X