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. 总结

在本文中,我们通过以下步骤实现了商和余数的计算:

  1. 使用 /% 运算符直接计算
  2. 创建一个返回 Pair 的函数,一次性获取两个值
  3. 使用 require() 校验除数是否为 0,避免异常
  4. 使用扩展函数和 infix 语法,使调用更自然、更具可读性

最终,我们得到了一个简洁、安全、可复用的函数。

完整源码可在 GitHub 上找到。


原始标题:Compute Quotient and Remainder in Kotlin