在 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.
我目前正在用 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.