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

この記事からわかること

  • Swift浮動小数点数型の値を切り上げ/切り捨て/四捨五入する方法
  • ceil/floor/round関数の使い方
  • 小数点第2位や3位など任意の桁数丸め処理
  • 文字列型変換して小数点の表示桁数調整する方法
  • String(format:)の使い方

index

[open]

\ アプリをリリースしました /

みんなの誕生日

友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-

posted withアプリーチ

環境

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の違い

同じ浮動小数点数型であるFloatDoubleの違いは許容できる桁数の違いです。変数初期格納時に許容外の桁数を渡しても問題はありませんが異なるデータ型を受け入れられるわけではありません

let numF:Float = 3.141592653589793238462643
var numD:Double = 3.141592653589793238462643

numD = numF // エラー
Cannot assign value of type 'Float' to type 'Double'

浮動小数点数型の値を丸め処理する関数

Swiftでは浮動小数点数型の値に対して小数点以下を丸めることができる関数が用意されています。

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型であることでした。計算対象のfivetenは型推論によりInt型が割り当てられており、Int同士の計算だったので結果が小数点になってもサポート外になっていたようです。なので明示的にDoubleを指定することで解決しました。

let five: Double = 5
let ten: Double = 10

print(five/ten) // 0.5

もちろんですがIntDoubleにすると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学習に使用した参考書

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index