バイト → KB 変換
アップロードの上限を決めるとき、設定ファイルには 10485760 のような数字が並びます。大きいのか小さいのか、桁を数えないと分かりません。これを人が読める大きさに直す一歩目が、割り算です。
桁を数えないと大きさが分からない
コンピュータが数える最小の単位は bit で、8 個まとめたものが 1 byte です。ファイルの大きさも、通信量も、DB に入る 1 行の重さも、根っこはこの byte で数えられています。ただし byte のまま並べると桁が多すぎるので、1024 個ごとに名前を付け替えて短く書きます。
| 単位 | byte 数 |
|---|---|
| 1 KB | 1,024 |
| 1 MB | 1,048,576 |
| 1 GB | 1,073,741,824 |
| 1 TB | 1,099,511,627,776 |
上の段へ 1 つ上がるたびに 1024 倍です。1000 ではなく 1024 なのは、これが 2 の 10 乗で、2 進数の世界ではきりのよい数だからです。逆に、下の単位から上の単位へ直したいときは 1024 で割ります。冒頭の 10485760 も、2 段上がれば見慣れた数字になります。
Python
print(2 ** 10) # 1024
print(1 << 10) # 1024 2 進数では 1 を 10 個ぶんずらすだけ整数で割ると、あと少しが消える
割り算には、小数を捨てる書き方と、小数を残す書き方があります。どちらを選ぶかで結果が変わります。
Python
elapsed_ms = 1500
print(elapsed_ms // 1000) # 1
print(elapsed_ms / 1000) # 1.5// は小数を捨てるので、1.5 秒が 1 秒になります。容量でも同じことが起きます。あと少しで 1 段上がる値と、ほとんど空の値が、同じ数字に見えてしまうということです。差を残したいときは小数のまま返します。
JavaScript
const bits = 20;
console.log(bits / 8); // 2.5JavaScript の / は最初から小数を返すので、切り捨てたいときだけ Math.floor を足します。逆に Python は割り算の記号が 2 種類あるので、どちらを書いたかを毎回意識します。
丸めるのは表示のとき
2.5 を 2.5 KB と出すか 3 KB と出すかは、画面側の都合です。変換する関数の中で小数点以下を落としてしまうと、あとから桁を増やしたくなったときに直す場所が増えます。数を返す関数は生の値を返し、丸めは見せる直前で行う、と分けておきます。こう分けておくと、単位の数え方を変えたくなった日も、直すのは 1 か所で済みます。
Mbpsは 1 秒あたりの bit 数、MB/sは 1 秒あたりの byte 数です。同じ数字が並んでいても 8 倍違います。回線の速度とダウンロードの速度が食い違って見えるのは、たいていこれが原因です。
1024 と 1000 が食い違う
OS がファイルの大きさを出すときは 1024 ごと、ハードディスクの箱に書いてある容量は 1000 ごとで数えていることが多いです。同じ 1 TB でも、箱の表記より OS の表示が小さく見えるのはこのためです。1024 ごとの単位を厳密に書き分けるときは KiB MiB GiB を使いますが、会話では KB と言いながら 1024 を指していることがほとんどです。今回は 1024 で数えます。
要件
- byteToKb という名前の関数を実装すること
- 1 KB = 1024 byte として計算すること
- 0 や 512 など小さい値でも正しい値を返すこと
入出力例
byteToKb(1024) → 1
byteToKb(2048) → 2
byteToKb(0) → 0
byteToKb(512) → 0.5
byteToKb(1048576) → 1024