3秒でわかる
あるデータ型の値を別の型として扱い直すこと。入力欄の文字列を数値にするなど、外から来た値を計算に使う前に必ず通る処理です。
もう少し詳しく
どういうものか
型変換は、ある型の値を別の型の値として扱い直すことです。文字列 "42" を整数 42 にする、小数 3.9 を整数 3 にする、といった操作がこれにあたります。書き手が明示的に関数を呼ぶ変換をキャストや明示的型変換、言語が勝手に行う変換を暗黙的型変換と呼びます。
なぜ必要か
プログラムの外から入ってくる値は、ほぼ例外なく文字列です。フォームの入力、コマンドライン引数、CSV の1行、環境変数、いずれも中身が数字に見えても型は文字列です。文字列のまま足し算をすると、多くの言語では連結になったり、そもそもエラーになったりします。外部の値を内部の計算に持ち込む境目で、必ず型変換が要ります。
具体例
age_text = input("年齢を入力 ") # 常に文字列
age = int(age_text) # 明示的に整数へ
print(age + 1)
print(int("42")) # 42
print(float("3.14")) # 3.14
print(str(42) + "歳") # "42歳"
print(int(3.9)) # 3 切り捨てであって四捨五入ではない
print(int("42abc")) # ValueError で落ちる// JavaScriptは暗黙変換が強く働く
console.log("5" + 3); // "53" +は連結を優先
console.log("5" - 3); // 2 -は数値に寄せる
console.log(Number("5")); // 5 明示的に変換するのが安全
console.log(Number("")); // 0 空文字が0になる
console.log(parseInt("12px", 10)); // 12 途中まで読むつまずきやすいところ
Python では、変換できない文字列を渡すと ValueError で処理が止まります。ユーザー入力を扱うなら try で受けるか、str.isdigit() で事前に確かめます。全角の「42」は int() が受け付けますが isdigit() の判定と食い違うことがあるため、入力の正規化を先に行うのが確実です。
JavaScript では逆に、変換に失敗しても例外にならず NaN が返ります。NaN は何と計算しても NaN のまま伝播し、しかも NaN === NaN は false なので、比較で見つけようとすると失敗します。Number.isNaN(value) を使います。空文字が 0 に化けるのも見落としやすく、未入力を 0 円として計算してしまう不具合につながります。
小数から整数への変換が切り捨てである点も共通の罠です。金額の計算で int(price * 1.1) と書くと1円足りなくなります。丸めたいなら round() を使い分けます。
似た用語との違い
| 語 | 内容 |
|---|---|
| 明示的型変換 | int() や Number() のように、書き手が呼んで変換する |
| 暗黙的型変換 | 演算子の都合で言語が自動的に変換する。事故の元になりやすい |
| 型推論 | 変換ではなく、書かなかった型をコンパイラが決めること |