Swiftには、主に2つの数値のカテゴリがあります。整数と浮動小数点数です。
数値リテラルには、読みやすくするためにアンダースコアを挿入できます。1_000_000は1000000と同じです。
浮動小数点リテラルは、10進数表記または指数表記で書くことができます。
ほとんどの場合、整数にはIntを、浮動小数点数にはDoubleを使います。
let speed: Int = 42 // Explicit Int
let pi: Double = 3.14 // Explicit Double
let giga: Double = 1_000_000_000 // Double with readability underscores
let plancksConstant: Double = 6.62607015e-34 // Double in scientific notation
Swiftには、数値計算のための標準的な算術演算子があります。
| 演算子 | 説明 | 例 |
|---|---|---|
+ |
加算 |
4 + 6の結果は10
|
- |
減算 |
15 - 10の結果は5
|
* |
乗算 |
2 * 3の結果は6
|
Swiftは型安全であり、算術演算で異なる数値型を混ぜることはできません。
IntとDoubleを直接足したり掛けたりすることはできません。先に、一方の型をもう一方に合わせて変換する必要があります。
/演算子は除算を行います。
両方のオペランドが整数の場合、整数除算では小数部分が切り捨てられます。
5.0 / 2.0 // 2.5 (Double division)
5 / 2 // 2 (integer division truncates the remainder)
0以外の浮動小数点数を0で割ると、infまたは-infになります。
0.0を0.0で割ると、nan(Not a Number)になります。
一方、整数を0で割ると、コンパイル時または実行時エラーになります。
print(5.0 / 0.0) // Prints inf
print(-5.0 / 0.0) // Prints -inf
print(0.0 / 0.0) // Prints nan
// The following line will not compile:
// print(5 / 0) // Error: Division by zero
余り演算子(%)は、2つの整数を割った余りを計算します。
5 % 2 // 1
-5 % 2 // -1
// Dividing by zero produces an error:
// 5 % 0 // Error: Division by zero
Swiftでは、%はモジュロ演算子ではなく、真の余り演算子です。
結果は、2番目のオペランドの符号に関係なく、常に最初のオペランド(被除数)の符号になります。
5 % -2 // 1
-5 % 2 // -1
rounded()メソッドを使うと、浮動小数点数を丸めることができます。
デフォルトでは、rounded()は最も近い整数に丸めます。
.upや.downなど、特定の丸め規則を指定することもできます。
let x = 3.14
let y = x.rounded() // 3.0
let w = x.rounded(.down) // 3.0
let z = x.rounded(.up) // 4.0
数値の定数や変数を型注釈なしで宣言すると、Swiftがその型を推論します。
Intになります。Doubleになります。let x = 42 // Inferred as Int
let y = 42.0 // Inferred as Double
let z: Double = 42 // Explicitly typed as Double
異なる型の値どうしで演算を行うには、Double(_:)やInt(_:)のような型イニシャライザーを使って、一方の値を変換します。
let integerCount = 42
let floatingCount = Double(integerCount)
print(floatingCount) // Prints 42.0
let pi = 3.14
let integerPi = Int(pi)
print(integerPi) // Prints 3 (fractional part is truncated)
この演習では、フリーランサーがプロジェクトマネージャーとやり取りするのを手助けするコードを書きます。いくつかのユーティリティを用意して、日額と月額をすばやく計算できるようにしましょう。割引が指定される場合もあります。
まず、フリーランサーとプロジェクトマネージャーの間で、いくつかのルールを決めておきます。
場合によっては、フリーランサーが日額に割引を適用することもあります(たとえば、いちばん忠诚の高い顧客や非営利の顧客に対して)。
割引は、割合を表す小数として扱います。たとえば25.0(25%)です。
引数として時給を受け取り、日額を計算するdailyRateFromという関数を実装します。
契約では、1日は8時間が請求対象と定められています。
dailyRateFrom(hourlyRate: 60)
// Returns 480.0
返される日額はDoubleでなければなりません。
割引後の月額を計算するmonthlyRateFrom関数を実装します。
引数は2つ、時給と割引率(パーセント)です。
monthlyRateFrom(hourlyRate: 77, withDiscount: 10.5)
// Returns 12129
返される月額は、最も近い整数に切り上げる(天井関数を使う)必要があります。
予算、時給、割引を受け取り、それが丸1日分の仕事を何日まかなえるかを計算するworkdaysIn関数を実装します。
workdaysIn(budget: 20000, hourlyRate: 80, withDiscount: 11.0)
// Returns 35.0
返される日数は、次の整数に切り捨てる(床関数を使う)必要があります。