暗黙変換なし
int と float64 は足せない
Go
stock := 3 // int
rate := 0.1 // float64
total := stock * rate // エラープレーンテキスト
invalid operation: stock * rate (mismatched types int and float64)「型が合いません」と言われます。多くの言語なら勝手に合わせてくれるところで、Go は止まります。
なぜ止めるのか
勝手に変換すると、気づかないうちに値が変わることがあるからです。
プレーンテキスト
7 / 2 int どうし 3 小数が消える
7.0 / 2.0 float64 どうし 3.5どちらの計算をしたかったのかは、書いた人にしか分かりません。Go は推測せず、書いた人に決めさせます。
混ぜてよいかを毎回考えることになるので、書くのは少し面倒です。その代わり、読むときに計算結果を推測しなくて済みます。
明示的に変換する
変換は、型の名前を関数のように使います。
Go
float64(stock) // int を float64 にする
int(rate) // float64 を int にするさっきの計算はこう書きます。
Go
total := float64(stock) * rate // 0.30000000000000004変換で値が変わることがある
float64 から int への変換は、小数を切り捨てます。
Go
var f = 3.9
int(f) // 3。四捨五入ではない
var g = -3.9
int(g) // -3。0 に近づく向きに切る手数料の計算で気をつける場所です。
Go
price := 1200
fee := int(float64(price) * 0.1) // 120float64 で計算してから int に戻す、という順番になります。この行は第4章の手数料計算でそのまま使います。
同じ int どうしでも別の型
細かい話ですが、int と int64 も別の型です。
Go
var a int = 1
var b int64 = 2
a + b // エラー「整数なんだから足せるだろう」と思うところですが、Go は型の名前が違えば別物として扱います。徹底しているぶん、迷いがありません。
定数はそのままでは変換できない
上の例で一度変数に入れているのには理由があります。
Go
int(3.9) // コンパイルエラー3.9 のように直接書いた数値は、型の付いていない定数という扱いです。まだ float64 と決まっていないので、int への変換もできません。
プレーンテキスト
cannot convert 3.9 (untyped float constant) to type int変数に入れると float64 という型が決まるので、そこから int へ変換できます。実際のコードでは計算結果を変数で受けていることがほとんどなので、この制約で困る場面はあまりありません。
要件
- 価格を
float64に変換してから手数料率を掛ける - 計算結果を
intに変換して返す - 小数は切り捨てる(
intへの変換がそのまま切り捨てになります)
入出力例
feeOf(1200, 0.1) → 120
feeOf(999, 0.1) → 99
feeOf(24800, 0.05) → 1240
feeOf(0, 0.1) → 0ヒント
編集 ゆめさく編集部