2017-09-26 50 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.