2017-09-26 55 views
2

我目前正在构建我的Smalltalk的第一件事,我遇到了问题。我必须处理用户输入的数字,我需要将它除以2,仍然是一个整数。如果用户输入10,我将与5一起工作,如果他们输入11,我必须与6一起工作,但我显然会得到5.5。Roundt整数在Smalltalk

如果我能得到一个数字的mod,我可以简单地确保mod = 0,否则加0.5,它会做得一样好,但我无法找到如何在SmallTalk中进行mod操作,所有我的搜索最终会发现与实际社交小游戏无关的东西,这非常令人沮丧。

所以,如果你能告诉我如何得到一个数字的mod,这将是非常好的,如果你能告诉我如何用一个单独的函数进行调整,甚至更好。感谢您的帮助和时间。

更新:经过一番研究,我试图做这样说:

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

这里为“国防部”是国防部变量“相提并论”的,如果是不为0,应该加起来0.5到标准杆。

我现在的问题是,尝试在时间重复使用par会导致“BoxedFloat64不明白#timesRepeat”错误。所以我仍然处于同一个问题,或者只是需要一种方法来使一个整数浮动。

+1

您能否指定您使用的方言?例如pharo,squeak,vw,...? –

+0

Pharo,虽然我的问题已经修复,谢谢。但是,如果您知道如何将浮点数(不包含小数部分)转换为整数,那么对于将来的参考将非常有用。 – Markski

+0

您可以随时浏览BoxedFloat64及其超类的方法(Squeak具有“浏览协议”功能,可让您同时浏览所有这些方法,但我不知道它是否仍可在Pharo中使用,以及它是如何被调用的那里)。 Number有一个截断float的'asInteger'方法(这不正是你想要的,但它可以指导你进一步的方法)。还有'roundUpTo:','roundTo:'和'rounded'。整数除法的二进制消息是// //,其模伴侣是双反斜杠。 – JayK

回答

5

有很多方法。例如

DIV之前加1到输入的号码由2如果输入的号码是奇数

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

使用天花板方法

^(enteredNumber/2) ceiling 
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.