在 Smalltalk 中舍入为整数

Round to Integer in Smalltalk

我目前正在用 Smalltalk 构建我的第一个东西,但我遇到了一个问题。我必须处理一个用户输入的数字,我需要 div 它乘以 2 并且仍然是一个整数。如果用户输入 10,我将使用 5,如果他们输入 11,我必须使用 6,但我显然会得到 5.5。

如果我能得到一个数字的 mod 我可以简单地确保 mod = 0 否则添加 0.5 就可以了,但我就是找不到如何在 SmallTalk 中进行 mod 操作,我所有的搜索都以与实际社交 smalltalk 无关的内容结束,这非常令人沮丧。

因此,如果您能告诉我如何获取数字的 mod 就太好了,如果您能告诉我如何使用单独的函数进行舍入,那就更好了。感谢您提前提供帮助和时间。

更新:经过一些研究,我尝试这样做:

mod := par rem: 2.
mod = 0 ifFalse: [ par := par + 0.5 ].

其中 "mod" 是变量 "par" 的 mod,如果它不是 0,则它应该与 par.

相加 0.5

我现在的问题是尝试在 timesRepeat 中使用 par 会引发 "BoxedFloat64 did not understand #timesRepeat" 错误。所以我仍然遇到同样的问题,或者只是需要一种方法将浮点数变成整数。

有很多方法。例如

如果输入的数字是奇数,div之前输入的数字加 1 乘以 2

temp := enteredNumber.
temp odd ifTrue: [temp := temp + 1 ].
^temp / 2 

使用天花板法

^(enteredNumber / 2) ceiling

在 Smalltalk 中,我们有一个整数除法运算符(甚至两个运算符):

11 / 2

会回答一个 Fraction,而不是整个 Integer
但是:

11 // 2

将回答除法的商,向负无穷大四舍五入
相应的余数将是:

11 \ 2

商的第二个运算符quo:和余数的rem:
区别仅在于负 receiver/operand:后面的将商截断为零。

-11 // 4 = -3. "floored toward negative infinity"
-11 \ 4 = 1.
(-11 quo: 4) = -2. "truncated toward zero"
(-11 rem: 4) = -3.

如果你想将商向上四舍五入(向正无穷大),那么你可以写:

(anInteger + 1) // 2.

如果您对二元运算符的优先级有足够的信心,则相同但不带括号:

anInteger + 1 // 2.