Quand je fais (/ 7 2)
, que dois-je faire pour obtenir le résultat 3
? Si je fais (/ 7 2.0), je reçois 3.5
, ce qui est comme prévu.Division entière en Common Lisp?
Répondre
(floor 7 2)
Ref: http://rosettacode.org/wiki/Basic_integer_arithmetic#Common_Lisp
Utilisez la fonction floor
. En SBCL:
* (floor (/ 7 2))
3
1/2
Deux valeurs sont renvoyées, la partie entière et la partie fractionnaire.
Vous pouvez utiliser la fonction floor
:
(floor 7 2)
3
1
Notez qu'il renvoie plusieurs valeurs, et vous avez seulement besoin de la première. Depuis floor
renvoie des valeurs multiples, qui peut être fait avec multiple-value-bind
comme suit:
(multiple-value-bind (q r) (floor 7 2) q)
=> 3
Edit: Comme Rainer note dans son commentaire, il vous suffit de passer le résultat de floor
comme argument si vous avez besoin est le quotient.
[1]> (floor 7 2)
3 ;
1
[2]> (+ (floor 7 2) 5)
8
[3]>
Je quitte la référence à multiple-value-bind
dans la réponse, car il est une fonction importante à connaître.
comment puis-je obtenir la première valeur? retourne-t-il une liste ?? – appusajeev
@appusajeev: J'ai mis à jour la réponse –
qui n'est pas nécessaire. la première valeur est automatiquement transmise au code suivant. Vous avez besoin de MULTIPLE-VALUE-BIND si vous voulez toutes les valeurs ou certaines. (valeurs (étage 7 2)) renvoie juste le premier. –
Voir FLOOR, CEILING and TRUNCATE dans ANSI Common Lisp.
exemples (voir les nombres positifs et négatifs):
CL-USER 218 > (floor -5 2)
-3
1
CL-USER 219 > (ceiling -5 2)
-2
-1
CL-USER 220 > (truncate -5 2)
-2
-1
CL-USER 221 > (floor 5 2)
2
1
CL-USER 222 > (ceiling 5 2)
3
-1
CL-USER 223 > (truncate 5 2)
2
1
Habituellement, la division vers entier TRUNCATE est utilisé.
FLOOR fait la division par lui-même. – Svante
True, mais cela fonctionne également avec un seul argument. –