Smalltalk中的Round to Integer

时间:2017-09-26 13:55:48

标签: smalltalk pharo

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

如果我能得到一个数字的mod我可以简单地确定mod = 0否则加0.5并且它会做得同样好,但我无法找到如何在SmallTalk中进行mod操作,所有我的搜索结果与实际的社交小音量无关,这非常令人沮丧。

所以,如果你能告诉我如何获得一个数字的模型,那将是很好的,如果你能告诉我如何用一个单独的函数进行整理,甚至更好。感谢你的帮助和时间。

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

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

其中" mod"是变量" par"的mod,如果它不是0,它应该加0.5到par。

我现在的问题是尝试在一个时间里使用par重复出现一个" BoxedFloat64没有理解#timesRepeat"错误。所以我仍然处于相同的问题,或者只是需要一种方法将浮点数转换为整数。

2 个答案:

答案 0 :(得分:5)

有很多方法。例如

如果输入的数字为奇数

,则在div之前将输入的数字加1加2
temp := enteredNumber.
temp odd ifTrue: [temp := temp + 1 ].
^temp / 2 

使用上限方法

^(enteredNumber / 2) ceiling

答案 1 :(得分:4)

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

11 / 2

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

11 // 2

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

11 \\ 2

商的第二个运算符quo:和余数的rem: 区别仅在于负接收器/操作数:后者将商从零截断。

-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.