1. 概述
在几乎所有的编程语言中,执行基本的算术运算是程序员的基本技能之一。
在本教程中,我们将探讨在 Kotlin 中如何高效地计算两个整数的商(quotient)和余数(remainder)。
对于有经验的开发者来说,这并不是一个复杂的任务,但我们可以通过 Kotlin 的一些语言特性,写出更简洁、更具表达力的代码。
2. 问题简介
计算商和余数本身并不复杂。但在实际开发中,我们往往希望在一次函数调用中同时获得这两个值。
在 Kotlin 中,我们可以利用语言特性,如 Pair
、扩展函数(extension function)和 infix 函数来实现更自然的调用方式。
本文将通过一个完整的示例函数来展示如何优雅地实现这一目标。
3. 使用 /
和 %
运算符
Kotlin 提供了两个基本运算符:
/
:用于计算商%
:用于计算余数
它们的行为与 Java 一致,遵循“向零取整”(truncate toward zero)规则。
示例代码如下:
val quotient1 = 42 / 4
val remainder1 = 42 % 4
assertEquals(10, quotient1)
assertEquals(2, remainder1)
val quotient2 = -42 / 4
val remainder2 = -42 % 4
assertEquals(-10, quotient2)
assertEquals(-2, remainder2)
val quotient3 = -42 / 2
val remainder3 = -42 % 2
assertEquals(-21, quotient3)
assertEquals(0, remainder3)
从上述示例可以看出:
- 商 = 被除数 / 除数
- 余数 = 被除数 % 除数
⚠️ 注意:当除数为 0 时,会抛出 ArithmeticException
,这点我们稍后会处理。
4. 创建返回商和余数的函数
为了更方便地一次获取两个值,我们可以创建一个函数,返回类型为 Pair<Int, Int>
,分别表示商和余数。
fun getQuotientAndRemainder(dividend: Int, divisor: Int): Pair<Int, Int> {
require(divisor != 0) { "除数不能为 0" }
return dividend / divisor to dividend % divisor
}
使用示例如下:
getQuotientAndRemainder(42, 4).apply {
assertEquals(10, first)
assertEquals(2, second)
}
getQuotientAndRemainder(-42, 4).apply {
assertEquals(-10, first)
assertEquals(-2, second)
}
getQuotientAndRemainder(-42, 2).apply {
assertEquals(-21, first)
assertEquals(0, second)
}
✅ 优点:
- 一次调用获取两个值
- 使用
require
提前校验除数是否为 0,避免运行时异常
❌ 缺点:
- 调用方式不够自然,需要手动传入两个参数
5. 创建扩展函数
为了让调用更自然,我们可以将该功能封装为 Int
的扩展函数,并使用 infix
关键字使其调用更接近自然语言。
infix fun Int.dividedBy(divisor: Int): Pair<Int, Int> {
require(divisor != 0) { "除数不能为 0" }
return this / divisor to this % divisor
}
调用方式如下:
val (quotient, remainder) = 42 dividedBy 4
✅ 优点:
- 更自然的调用方式:
42 dividedBy 4
- 支持解构赋值(destructuring declaration),代码更简洁
💡 小贴士:
- 使用
infix
函数时,必须是只有一个参数的扩展函数或成员函数 - 函数名不能包含特殊字符,推荐使用有意义的英文命名,如
dividedBy
6. 总结
在本文中,我们通过以下步骤实现了商和余数的计算:
- 使用
/
和%
运算符直接计算 - 创建一个返回
Pair
的函数,一次性获取两个值 - 使用
require()
校验除数是否为 0,避免异常 - 使用扩展函数和
infix
语法,使调用更自然、更具可读性
最终,我们得到了一个简洁、安全、可复用的函数。
完整源码可在 GitHub 上找到。