[Kotlin] 負数に対する除算の商と剰余
目次
AtCoder Beginner Contest 239のB問題を解いていてWAになり、解説を読んでいたら勉強になったのでメモ。負の値に対する除算の商と剰余について。
実は負数の除算はいくつか定義があり、プログラム言語によって定義が異なる という大きな問題があります。詳しい話は以下で説明しますが、例えば −24 を割られる数、 10 を割る数として整数除算した時の答えは言語によって −2 になったり −3 になったりします。 解説 - デンソークリエイトプログラミングコンテスト2022(AtCoder Beginner Contest 239)
Kotlinの(Int型やLong型に対する)除算のドキュメントを探すと、例えばInt型なら div
関数を見れば良さそうでしょうか(Kotlinの算術演算子は operator fun
でオーバーロードされる)。
ここには、0に近い方に丸めると記載されてます。
Divides this value by the other value, truncating the result to an integer that is closer to zero.
例えば -1 に対して 2 で除算を行うと、( -0.5 が 0 に近い方に丸められて) 0 となります。同様に -3 に対して 2 で除算を行うと、( -1.5 が 0 に近い方に丸められて) -1 となります。
fun main() {
println(-1 / 2) // 0, not -1
println(-2 / 2) // -1
println(-3 / 2) // -1, not -2
}
剰余がどうなるかというと、上記の除算の結果と整合する自然な値になります。
fun main() {
println(-1 % 2) // -1
println(-2 % 2) // 0
println(-3 % 2) // -1
}
負の除算については注意して扱わないと思わぬバグを生みそうです。数年来プログラミングをしてきましたが、初歩的なところに理解のあやふやな知識があることに気付けて良かったです。
Reference
- 解説 - デンソークリエイトプログラミングコンテスト2022(AtCoder Beginner Contest 239)(最終アクセス日:2022年2月20日)
- div - Kotlin Programming Language(最終アクセス日:2022年2月20日)
書いている人 😎

茨城県つくば市在住のモバイルアプリケーションアーキテクト(Androidが得意です)。モバイルアプリのアーキテクチャ、自動テスト、CI/CDに興味があります。いわゆる「レガシーコード」のリファクタリング・リアーキテクチャが好きです。
👉 もっと詳しく
著書 ✍
ソフトウェアデザイン 2023年6月号📚
特集「クリーンアーキテクチャとは何か?」の第5章「モバイルアプリ開発における実践」を執筆しました。
Android クリーンアーキテクチャ ヒッチハイク・ガイド🧳
Androidアプリでのクリーンアーキテクチャに入門するためのガイダンスです。クリーンアーキテクチャの概念を理解し、Androidアプリに適用する方法を解説しています。
Android ユニットテスト ヒッチハイク・ガイド🧳
Androidアプリのユニットテストに入門するためのガイダンスです。初学者が混乱せずにAndroidアプリのユニットテストを書き始めることができる、ということを目的としています。
Android MVVMアーキテクチャ入門🛠
Androidアプリ開発の初学者に向けた、MVVM(Model-View-ViewModel)アーキテクチャの入門書を書きました。初学者の方を確実にネクストレベルに引き上げる技術書です。NextPublishingより出版されています。
関連記事 👀
- DroidKaigi.collect{ #1@Tokyo }で「例外を投げるな、値を返せ」というLTをしました
- [Kotlin] 末尾カンマ
- [Kotlin] ifを愛でる
- [Kotlin] ユークリッドの互助法を用いて最小公約数・最小公倍数の計算を実装する
- [Kotlin] はじめてのカリー化