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
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
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
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.
Sans utiliser 'use integer', vous pouvez toujours écrire -1 & $x qui renvoie la valeur entière de $x ...
@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.
Oui, mais la division entière serait int(5) / int(1.5). Sinon, vous ne faites qu'arrondir la division réelle.
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.
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.
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 ;
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.
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.