18

当我这样做时(/ 7 2),我应该怎么做才能得到结果3?如果我这样做(/ 7 2.0),我会得到3.5,这是预期的。

4

4 回答 4

26
(floor 7 2)

参考:http ://rosettacode.org/wiki/Basic_integer_arithmetic#Common_Lisp

于 2010-01-16T09:40:01.623 回答
21

请参阅ANSI Common Lisp 中的FLOOR、CEILING 和 TRUNCATE

例子(见正数和负数):

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

通常使用 TRUNCATE 除以整数。

于 2010-01-16T11:54:42.520 回答
7

您可以使用以下floor功能:

(floor 7 2)
3
1

请注意,它返回多个值,您只需要第一个。由于floor返回多个值,因此可以通过multiple-value-bind以下方式完成:

(multiple-value-bind (q r) (floor 7 2) q)
=> 3

编辑:正如 Rainer 在他的评论中指出的floor那样,如果您只需要商,您可以将结果作为参数传递。

[1]> (floor 7 2)
3 ;
1
[2]> (+ (floor 7 2) 5)
8
[3]>

我将multiple-value-bind在答案中留下参考,因为这是一个需要熟悉的重要功能。

于 2010-01-16T09:40:30.113 回答
3

使用该floor功能。在 SBCL 中:

* (floor (/ 7 2))

3
1/2

返回两个值,整数部分和小数部分。

于 2010-01-16T09:39:30.827 回答