整数同士の除算演算子の挙動 (C言語、C++、Scala、Java、Rust、Go言語、PHP、JavaScript、Perl、Python、Ruby、Elixir)

整数での `/` と `%` の演算子の挙動。

整数を整数で割ったら **整数** vs **浮動小数点数** どっち？

- `-5 / 4` は **-1.25**
    - PHP
        - 割り切れないから浮動小数点数
        - C言語派のために `intdiv` という関数もある
    - Perl
        - 割り切れないから浮動小数点数
        - `use integer` を宣言するとC言語派に変わる
    - Python
        - 割り切れるか関係なく割り算したら浮動小数点数
        - C言語派のために `//` という演算子もある
    - Elixir
        - 割り切れるか関係なく割り算したら浮動小数点数
        - C言語派のために `div` という関数もある
    - JavaScript
        - はじめから整数と浮動小数点数の区別がない
- `-5 / 4` は **-1**
    - C言語 / C++ / Scala / Java  / Rust / Go言語
        - 静的型付けの言語
- `-5 / 4` は **-2**
    - Ruby
        - 仲間はずれ

※2020/09/16 ↑コメントを受けPHPに追記
※2020/09/16 ↑Elixirを追記

負の剰余(割り算の余り `%`演算子)は **正** vs **負** どっち？

- `-5 % 4` は **-1**
    - C言語 / C++ / Scala / Java  / Rust / Go言語
        - 静的型付けの言語
    - PHP / JavaScript
    - Elixir
        - `%`はなくて`rem`を使う
- `-5 % 4` は **3**
    - Perl
        - `use integer` を宣言するとC言語派に変わる
    - Python / Ruby

※2020/09/16 ↑Elixirを追記


# C言語 / C++ / Scala / Java  / Rust / Go言語

- `/`
    - 整数を整数で除算すると整数になる
    - 0に近い方に丸められる
- `%` (剰余)
    - `(a / b * b) + (a % b)` が `a` と一致

| a | b | `a / b` | `a % b` |
| ---- | ---- | ---- | ---- |
| 5 | 4 | 1 | 1 |
| 5 | -4 | -1 | 1 |
|-5 | 4 | -1 | -1 |
| -5 | -4 | 1 | -1 |


# PHP

- `/`
    - 整数を整数で除算すると、割り切れない場合は浮動小数点数になる
- `%` (剰余)
    - `(int)(a / b) * b + (a % b)` が `a` と一致 (intへのキャストは0に近い方に丸める)
- `intdiv` (整数の除算) (2020/09/16 コメントを受け追記)
    - 整数を整数で除算すると整数になる
    - 0に近い方に丸められる

| a | b | `a / b` | `intdiv(a, b)` | `a % b` |
| ---- | ---- | ---- | ---- | ---- |
| 5 | 4 | 1.25 | 1 | 1 |
| 5 | -4 | -1.25 | -1 | 1 |
|-5 | 4 | -1.25 | -1 | -1 |
| -5 | -4 | 1.25 | 1 | -1 |


# JavaScript

- `/`
    - 整数を整数で除算すると、割り切れない場合は浮動小数点数になる
        - JavaScriptではそもそも整数も浮動小数点数も区別していない
            - [JavaScriptの数値型完全理解 - Qiita](https://qiita.com/uhyo/items/f9abb94bcc0374d7ed23)
- `%` (剰余)
    - `Math.trunc(a / b) * b + (a % b)` が `a` と一致 (Math.truncは0に近い方に丸める)

| a | b | `a / b` | `a % b` |
| ---- | ---- | ---- | ---- |
| 5 | 4 | 1.25 | 1 |
| 5 | -4 | -1.25 | 1 |
|-5 | 4 | -1.25 | -1 |
| -5 | -4 | 1.25 | -1 |


# Perl

`use integer`を宣言していない場合。

- `/`
    - 整数を整数で除算すると、割り切れない場合は浮動小数点数になる
- `%` (剰余)
    - `floor(a / b) * b + (a % b)` が `a` と一致 (floorは負の無限大の方向に丸める)

| a | b | `a / b` | `a % b` |
| ---- | ---- | ---- | ---- |
| 5 | 4 | 1.25 | 1 |
| 5 | -4 | -1.25 | -3 |
|-5 | 4 | -1.25 | 3 |
| -5 | -4 | 1.25 | -1 |


# Perl (use integer)

`use integer`を宣言した場合。

- `/`
    - 整数を整数で除算すると整数になる
    - 0に近い方に丸められる
- `%` (剰余)
    - `(a / b * b) + (a % b)` が `a` と一致

| a | b | `a / b` | `a % b` |
| ---- | ---- | ---- | ---- |
| 5 | 4 | 1 | 1 |
| 5 | -4 | -1 | 1 |
|-5 | 4 | -1 | -1 |
| -5 | -4 | 1 | -1 |


# Python

Python3の場合。(2は違う)

- `/`
    - 整数を整数で除算すると、常に浮動小数点数になる
- `//` (整数除算)
    - 整数を整数で除算すると整数になる
    - 負の無限大の方向に丸められる
- `%` (剰余)
    - `(a // b * b) + (a % b)` が `a` と一致

| a | b | `a / b` | `a // b` | `a % b` |
| ---- | ---- | ---- | ---- | ---- |
| 5 | 4 | 1.25 | 1 | 1 |
| 5 | -4 | -1.25 | -2 | -3 |
|-5 | 4 | -1.25 | -2 | 3 |
| -5 | -4 | 1.25 | 1 | -1 |


# Ruby

- `/`
    - 整数を整数で除算すると整数になる
    - 負の無限大の方向に丸められる
- `%` (剰余)
    - `(a / b * b) + (a % b)` が `a` と一致

| a | b | `a / b` | `a % b` |
| ---- | ---- | ---- | ---- |
| 5 | 4 | 1 | 1 |
| 5 | -4 | -2 | -3 |
|-5 | 4 | -2 | 3 |
| -5 | -4 | 1 | -1 |


# Elixir

こちらを参照
[整数同士の除算演算子の挙動(Elixir)](https://qiita.com/torifukukaiou/items/1f2b4eb32f7663e0071a) (@torifukukaiou さんの記事)


# リンク

多言語シリーズの私の記事

- [インクリメント・デクリメントの書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby、JavaScript)](https://qiita.com/suzuki-navi/items/6611b9f16a391bac5ac5)
- [if文の書き方のまとめ(Scala、Java、Rust、C言語、C++、Go言語、PHP、Perl、Python、Ruby)](https://qiita.com/suzuki-navi/items/16793a5f5e67fb8d3fc2)