我目前在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"错误。所以我仍然处于相同的问题,或者只是需要一种方法将浮点数转换为整数。
答案 0 :(得分:5)
有很多方法。例如
如果输入的数字为奇数
,则在div之前将输入的数字加1加2temp := 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.