【Swift】小数点の切り上げ/切り捨て/四捨五入方法!第2位などの桁数

この記事からわかること
- Swiftで浮動小数点数型の値を切り上げ/切り捨て/四捨五入する方法
- ceil/floor/round関数の使い方
- 小数点第2位や3位など任意の桁数で丸め処理
- 文字列型に変換して小数点の表示桁数を調整する方法
- String(format:)の使い方
index
[open]
\ アプリをリリースしました /
環境
- Xcode:14.3.1
- iOS:16.4
- Swift:5.8.1
Swiftで浮動小数点数型の値を切り上げ/切り捨て/四捨五入する方法をまとめていきたいと思います。
Swiftで数値を扱うデータ型の違い
Swiftでは数値を扱うデータ型は複数存在します。
Swiftの数値データ型
型名 | 概要 | 例 |
---|---|---|
Int | 整数型 | 23 |
Float | 32ビット浮動小数点数型(小数点6桁まで) | 3.141593 |
Double | 64ビット浮動小数点数型(小数点15桁まで) | 3.141592653589793 |
数値を扱うという点では同じですが、データ型が異なるので許容していない範囲の数値を格納するとエラーになってしまいます。浮動小数点数型に関しては許容外の桁数を渡されると自動で収まる桁数に丸められます。
let numI:Int = 3.141592653589793238462643 // エラー
let numF:Float = 3.141592653589793238462643 // 許容できる範囲に自動で丸められる
let numD:Double = 3.141592653589793238462643 // 許容できる範囲に自動で丸められる
Int:Cannot convert value of type 'Double' to specified type 'Int'
Float:3.141593
Double:3.141592653589793
FloatとDoubleの違い
同じ浮動小数点数型であるFloat
とDouble
の違いは許容できる桁数の違いです。変数初期格納時に許容外の桁数を渡しても問題はありませんが異なるデータ型を受け入れられるわけではありません。
let numF:Float = 3.141592653589793238462643
var numD:Double = 3.141592653589793238462643
numD = numF // エラー
Cannot assign value of type 'Float' to type 'Double'
浮動小数点数型の値を丸め処理する関数
Swiftでは浮動小数点数型の値に対して小数点以下を丸めることができる関数が用意されています。
- ceil:切り上げ
- floor:切り捨て
- round:四捨五入
let num:Double = 5.6
let ceilNum = ceil(num) // 6
let floorNum = floor(num) // 5
let roundNum = round(num) // 6
小数点第2位や3位など任意の桁数で丸め処理
Swiftで用意されている関数は小数点の位の丸め位置を指定することはできません。例えば小数点第2位で四捨五入をしたい時は「10倍してから丸めて10で割る(桁をずらす)」ことで桁解決できます。
var num:Double = 3.141592653589793238462643
let numCeil = ceil(num * 10)/10 // 3.2
let numFloor = floor(num * 100)/100 // 3.14
let numRound = round(num * 1000)/1000 // 3.142
小数点の位置をずらすことで任意の桁数で丸め処理を行うことができます。またそれにより表示させたい小数点以下の桁数をコントロールすることもできます。
文字列型に変換して小数点の表示桁数を調整
小数点以下の桁数の表示数を調整する際に便利なのがString(format:)
イニシャライザです。引数には表示させたい桁数の形式と対象の値を渡します。
init(
format: String, // 桁数
_ arguments: CVarArg... // 対象の値
)
var num:Double = 3.141592653589793238462643
print(String(format: "%.1f", num)) // 3.1
print(String(format: "%.3f", num)) // 3.142
print(String(format: "%.5f", num)) // 3.14159
「表示させたい小数点の桁数の形式」はフォーマット指定子と呼ばれる形式を指定します。その中で浮動小数点数型を指定する際は%.nf
(nに桁数)で指定します。
数値の0埋め
ちなみにString(format:)
イニシャライザで%0nd
を使うと数値の0埋めをすることもできます。指定した桁数に足りていない桁に0を入れてくれます。
var num:Int = 1
print(String(format: "%02d", num)) // 01
print(String(format: "%03d", num)) // 001
print(String(format: "%05d", num)) // 00001
割り算で小数点にならず0になる
Swiftで数値の割り算をしていた際になぜか結果が0になってしまう現象が起きました。
let five = 5
let ten = 10
print(five/ten) // 0
この原因はInt
型であることでした。計算対象のfive
とten
は型推論によりInt
型が割り当てられており、Int
同士の計算だったので結果が小数点になってもサポート外になっていたようです。なので明示的にDouble
を指定することで解決しました。
let five: Double = 5
let ten: Double = 10
print(five/ten) // 0.5
もちろんですがInt
とDouble
にするとBinary operator '/' cannot be applied to operands of type 'Int' and 'Double'
というエラーになって計算できないので注意してください。
let five: Int = 5
let ten: Double = 10
print(five/ten)
// Binary operator '/' cannot be applied to operands of type 'Int' and 'Double'
Kotlinでの小数点の取り扱いはこちら
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
私がSwift UI学習に使用した参考書