読み込み中...

Swiftで四捨五入の完全マスターする方法10選

Swift言語での四捨五入の方法 Swift
この記事は約18分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

はじめに

Swiftでの四捨五入の技術を完全にマスターする方法を探しているあなたへ。

この記事を読めば、Swiftでの四捨五入を自在に操る技術が身につくでしょう。

数値を整数に四捨五入する基本的な方法から、小数点以下の特定の位で四捨五入するテクニック、さらにはSwiftでの四捨五入を利用したプログラミングの応用例まで、幅広く詳しく解説します。

●Swiftと四捨五入の基本

○Swift言語の概要

SwiftはAppleが開発したプログラミング言語で、iOS、macOSなどのアプリ開発に主に使用されます。

そのシンタックスは直感的で読みやすいため、初心者にも学びやすい言語と言えます。

Swiftは安全性とパフォーマンスが高く設計されており、最新のプログラミング言語の特長を備えています。

○四捨五入とは

四捨五入とは、小数点以下の数値を整数や特定の小数点まで丸める処理の一つです。

具体的には、小数点以下が5以上ならば次の整数に、それ未満ならばその整数に丸められます。

例えば、3.5は4に、3.4は3に四捨五入されます。

Swiftではこの四捨五入を効率的に行う方法が実装されています。

●Swiftでの四捨五入の使い方

Swiftには様々な四捨五入を行う方法が用意されており、シチュエーションに応じて適切なものを選択できます。

初心者から上級者まで、Swiftでの四捨五入の技術を身につけるためのステップバイステップの解説とともに、サンプルコードを交えて紹介していきます。

○サンプルコード1:基本的な四捨五入

Swiftで最もシンプルに四捨五入を行う方法を紹介します。

このコードではround()関数を使って四捨五入を行います。

let number = 3.6
let roundedNumber = round(number)
print(roundedNumber)

このコードを実行すると、3.6が最も近い整数である4に四捨五入され、結果として4が出力されます。

○サンプルコード2:指定した小数点まで四捨五入

小数点第n位までの四捨五入を行いたい場合は、まず10のn乗をかけてから四捨五入し、再度10のn乗で割るという手順を踏みます。

この手法を用いて、小数点第2位までの四捨五入を行うサンプルを紹介します。

let number = 3.145
let roundedToSecondDecimalPlace = round(number * 100) / 100
print(roundedToSecondDecimalPlace)

このコードを実行すると、3.145が小数第二位まで四捨五入され、結果として3.15が出力されます。

○サンプルコード3:四捨五入を適用した計算

四捨五入は計算の中で頻繁に利用されます。

例として、商品の価格を税込みで計算し、その結果を四捨五入して表示するサンプルコードを紹介します。

let priceWithoutTax = 1980.0
let taxRate = 0.10
let totalPrice = priceWithoutTax * (1 + taxRate)
let roundedTotalPrice = round(totalPrice)
print(roundedTotalPrice)

このコードでは、1980円の商品に10%の税率を適用した結果を四捨五入しています。

このコードを実行すると、税込みの合計価格が2178円として四捨五入され、結果として2178が出力されます。

●Swiftでの四捨五入の応用例

四捨五入は多くのプログラムで使用される基本的な機能ですが、Swiftでの実装にはさまざまな応用的な方法が存在します。

ここでは、特定の条件やシチュエーションに適した四捨五入の方法を紹介します。

○サンプルコード4:配列の各要素を四捨五入

Swiftの配列内の各要素を四捨五入する方法を考えてみましょう。

例えば、複数の浮動小数点数が含まれる配列を取り扱う場面で、それぞれの要素を四捨五入して整数に変換したい場合が考えられます。

var numbers = [2.4, 3.7, 1.2, 4.9]
let roundedNumbers = numbers.map { round($0) }
print(roundedNumbers)

このコードでは、map関数を利用して配列numbersの各要素を四捨五入し、新しい配列roundedNumbersを作成します。

結果として[2, 4, 1, 5]が出力されます。

○サンプルコード5:条件を指定しての四捨五入

特定の条件を満たす数値のみを四捨五入する方法を紹介します。

例えば、3以上の数値だけを四捨五入して整数に変換し、それ以外の数値はそのままの値を保持したい場合には次のようにコードを書きます。

var numbers = [2.4, 3.7, 1.2, 4.9]
let conditionalRoundedNumbers = numbers.map { $0 >= 3 ? round($0) : $0 }
print(conditionalRoundedNumbers)

このコードでは、3以上の数値のみを四捨五入して整数に変換し、それ以外の数値は変更せずに新しい配列conditionalRoundedNumbersを作成します。結果として[2.4, 4, 1.2, 5]が出力されます。

○サンプルコード6:四捨五入を利用したグラフ描画

Swiftでの四捨五入は、データの視覚化やグラフの描画時にも有効です。

具体的には、グラフ上のデータポイントを整数値に四捨五入することで、視覚的に分かりやすくしたり、グラフの読み取りを容易にすることができます。

ここでは、四捨五入を使用してグラフのデータポイントを整数値に変換するサンプルコードを紹介します。

import UIKit
import Charts

class ViewController: UIViewController {
    @IBOutlet weak var barChart: BarChartView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let values: [BarChartDataEntry] = [
            BarChartDataEntry(x: 1.0, y: 2.4),
            BarChartDataEntry(x: 2.0, y: 3.7),
            BarChartDataEntry(x: 3.0, y: 1.2),
            BarChartDataEntry(x: 4.0, y: 4.9)
        ].map { BarChartDataEntry(x: $0.x, y: round($0.y)) }

        let dataSet = BarChartDataSet(entries: values, label: "データ値")
        barChart.data = BarChartData(dataSet: dataSet)
    }
}

このコードでは、Chartsというライブラリを利用しています。

Chartsライブラリは、Swiftでグラフ描画を容易にするためのライブラリです。

先程のサンプルコードでは、四捨五入を行いつつ、バーチャートを表示しています。

このコードを実行すると、y軸のデータポイントが[2, 4, 1, 5]と四捨五入された整数値となり、それを基にバーチャートが描画されます。

○サンプルコード7:四捨五入の結果をテーブル表示

四捨五入の結果をテーブルで一覧表示する場合も考えられます。

例えば、商品の価格一覧などで、小数点以下の値を四捨五入して整数で表示するシチュエーションが考えられます。

ここでは、四捨五入を適用してテーブルに商品の価格を表示するサンプルコードを紹介します。

import UIKit

class PriceTableViewController: UITableViewController {
    let productNames = ["商品A", "商品B", "商品C", "商品D"]
    let productPrices: [Double] = [120.3, 150.8, 90.4, 210.7]

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return productNames.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "priceCell", for: indexPath)
        cell.textLabel?.text = productNames[indexPath.row]
        cell.detailTextLabel?.text = "¥\(Int(round(productPrices[indexPath.row])))"
        return cell
    }
}

このコードでは、商品の価格を四捨五入して整数にし、それをテーブルの詳細ラベルに表示しています。

このコードを実行すると、商品の価格が四捨五入された整数値としてテーブルに表示されます。

具体的には、「商品A」の価格が120円、「商品B」が151円、「商品C」が90円、「商品D」が211円と表示されます。

○サンプルコード8:ユーザー入力に基づく四捨五入

ユーザーがアプリケーションのインターフェース上で数値を入力し、その数値を四捨五入して表示する場面は、多くのアプリケーションで見受けられます。

例えば、費用計算や数量入力などの際に、小数点以下の数値を簡潔に四捨五入して整数にして表示したい場合などに役立ちます。

ここでは、ユーザーからの数値入力を受け取り、その数値を四捨五入してラベルに表示するシンプルなサンプルコードを紹介します。

import UIKit

class InputViewController: UIViewController {

    @IBOutlet weak var inputTextField: UITextField!
    @IBOutlet weak var resultLabel: UILabel!

    @IBAction func roundNumber(_ sender: UIButton) {
        guard let inputText = inputTextField.text, let inputValue = Double(inputText) else {
            resultLabel.text = "無効な入力です"
            return
        }
        let roundedValue = round(inputValue)
        resultLabel.text = "四捨五入結果:\(Int(roundedValue))"
    }
}

このコードでは、テキストフィールドに入力された数値を取得し、round関数を使用して四捨五入を行います。そして、その結果をラベルに表示しています。

入力された値が無効な場合、エラーメッセージをラベルに表示します。

このコードを実行する際の動作は、ユーザーがテキストフィールドに数値を入力(例:2.6)し、「四捨五入」ボタンを押すと、ラベルに「四捨五入結果:3」と表示される形になります。

○サンプルコード9:四捨五入と他の数学関数の組み合わせ

Swiftには四捨五入だけでなく、多くの数学関数が組み込まれています。

これらの関数を組み合わせて利用することで、より高度な数学的な処理を行うことが可能です。

ここでは、四捨五入と他の数学関数を組み合わせて、平均値を計算し、その結果を四捨五入して表示するサンプルコードを紹介します。

let numbers: [Double] = [12.4, 15.6, 14.2, 13.8, 12.9]
let sum = numbers.reduce(0, +)
let average = sum / Double(numbers.count)
let roundedAverage = round(average)
print("平均値の四捨五入結果は、\(Int(roundedAverage))です。")

このコードでは、reduce関数を使って数値の配列の合計を計算し、その後配列の要素数で割ることで平均値を計算しています。

そして、その平均値をround関数で四捨五入しています。

このコードを実行すると、数値の配列の平均値が13.78となるので、四捨五入の結果として14と表示されます。

○サンプルコード10:四捨五入を利用したゲームのスコア計算

ゲーム開発においても四捨五入は頻繁に利用される機能です。

特に、スコア計算やランキング表示などで小数点以下の数値を整数に変換する場面で活用されます。

ここでは、ゲームのスコアを計算し、その結果を四捨五入して表示するサンプルコードを紹介します。

var scores: [Double] = [98.5, 99.2, 97.4, 96.8]
let bonusScore: Double = 1.3
let finalScores = scores.map { round($0 + bonusScore) }
print("ボーナスポイントを加算した後のスコア:\(finalScores)")

このコードでは、各スコアにボーナスポイントを加算し、その結果を四捨五入して新しいスコア配列を作成しています。

このコードを実行すると、ボーナスポイントを加算した後のスコアが[100, 100, 99, 98]と表示されます。

●注意点と対処法

四捨五入の処理はシンプルに思えるかもしれませんが、実際にプログラミングで利用する際にはいくつかの注意点や問題点が存在します。

特に、Swift言語での四捨五入処理には独自の特性や挙動があるため、それらを理解しておくことは非常に重要です。

○四捨五入時の誤差とその対処法

コンピュータは浮動小数点数を用いて小数を表現するため、数値計算における精度の問題が発生することがあります。

四捨五入の処理も例外ではありません。

特定の数値を四捨五入する際に、期待した結果と異なる結果が得られる場合があります。

例えば、次のコードを考えてみましょう。

let value: Double = 0.145
let roundedValue = (value * 100).rounded() / 100
print(roundedValue) // 期待する出力は0.15

このコードでは、0.145という数値を小数点第2位で四捨五入しようとしています。

しかし、浮動小数点の誤差のため、期待する0.15ではなく、異なる結果が出力される可能性があります。

この問題を回避するためには、Decimal型を利用する方法があります。

Decimal型は浮動小数点数よりも高い精度で数値を扱うことができます。

let value = Decimal(string: "0.145")!
let roundedValue = NSDecimalNumber(decimal: value).rounding(accordingToBehavior: NSDecimalNumberHandler(roundingMode: .plain, scale: 2))
print(roundedValue) // 正確に0.15と出力されます。

このコードを利用することで、四捨五入時の誤差を最小限に抑えることができます。

○特定の条件下での四捨五入の挙動

Swiftのround関数は、正確に半分の値(例:0.5や-0.5)の場合、偶数方向への四捨五入が行われることに注意が必要です。

let value1: Double = 2.5
print(round(value1)) // 2.0

let value2: Double = 3.5
print(round(value2)) // 4.0

上のコードを実行すると、value1の結果は2.0、value2の結果は4.0となります。

これは、Swiftの四捨五入が「Bankers Rounding」と呼ばれる方法を採用しているためです。

この方法は、連続した数値の四捨五入時の誤差を減少させる効果がありますが、意図しない結果が得られることがあるため注意が必要です。

○性能面での注意点

Swiftでの四捨五入処理は高速に動作する設計となっていますが、大量のデータを一度に四捨五入する場合や、高頻度で四捨五入処理を行う場合には、パフォーマンスの低下が考えられます。

特に、Decimal型を使用する際は、内部的な計算が複雑となるため、処理速度が低下する可能性があります。

これを回避するためには、四捨五入の処理を必要最小限に抑える、またはバックグラウンドでの非同期処理

を活用して、ユーザーの操作に対する応答性を保持するように工夫することが考えられます。

また、繰り返し四捨五入を行う場合、計算結果をキャッシュして再利用するという方法も効果的です。

これにより、同じ計算を何度も行う手間を省くことができ、全体のパフォーマンスを向上させることが可能となります。

具体的なコード例を見てみましょう。

// 四捨五入の結果をキャッシュするディクショナリ
var cache: [Double: Double] = [:]

func cachedRounded(value: Double) -> Double {
    // キャッシュに結果がある場合はそれを返す
    if let cachedValue = cache[value] {
        return cachedValue
    }

    // 四捨五入の計算
    let result = round(value)

    // 計算結果をキャッシュに保存
    cache[value] = result

    return result
}

let sampleData = [2.5, 3.4, 2.5, 4.6, 2.5]
for data in sampleData {
    print(cachedRounded(value: data))
}

このコードでは、cachedRounded関数を使用して四捨五入の結果をキャッシュして再利用しています。

2.5というデータが複数回存在しても、実際の四捨五入の計算は一度しか行われません。

●カスタマイズ方法

Swiftで四捨五入を行う際に、デフォルトの方法だけでは要件を満たせない場面や、より効率的な方法を求める場合があります。

こうしたニーズに応えるために、四捨五入のカスタマイズ方法について詳しく解説します。

○カスタム四捨五入関数の作成

デフォルトの四捨五入関数では、特定の条件や計算方法をカスタマイズすることができません。

そこで、自身でカスタム四捨五入関数を作成することで、独自の計算ロジックを取り入れることが可能です。

例えば、小数点第3位を四捨五入する場合に、0.005未満の場合は切り捨て、それ以上の場合は切り上げるというロジックを実装することが考えられます。

// カスタム四捨五入関数の例
func customRound(value: Double, places: Int) -> Double {
    let divisor = pow(10.0, Double(places))
    return (value * divisor).rounded() / divisor
}

// 使用例
let value: Double = 123.4567
let roundedValue = customRound(value: value, places: 3)
print(roundedValue) // 123.457が表示される

このコードではcustomRound関数を使用して、小数点以下3位までの四捨五入を行っています。

指定した小数点位数までの四捨五入が求められる場面で、この関数を活用することができます。

○四捨五入に関連するライブラリやフレームワークの利用

Swiftのコミュニティでは、四捨五入に関連するライブラリやフレームワークが数多く提供されています。

これらを活用することで、複雑な計算や特殊な四捨五入のロジックも簡単に実現することができます。

例えば、SwiftDecimalというライブラリは、金融計算や会計計算における高精度な四捨五入をサポートしています。

import SwiftDecimal

let decimalValue = Decimal(string: "123.4567")!
let roundedDecimal = decimalValue.rounded(.toNearestOrAwayFromZero, scale: 3)
print(roundedDecimal) // 123.457が表示される

SwiftDecimalを利用すると、多くの計算オプションや、高い精度の四捨五入を行うことができます。

このようなライブラリやフレームワークを活用することで、Swiftにおける四捨五入の幅が広がります。

まとめ

Swiftにおける四捨五入の手法は多岐にわたります。

初心者から上級者まで、それぞれのニーズに合わせて多彩な方法が利用可能です。

基本的な四捨五入から、独自のロジックを取り入れたカスタム関数、さらには高精度計算をサポートする外部ライブラリの利用まで、この記事で詳しく解説しました。

特に、Swiftの強力な計算能力と柔軟性を活かすことで、様々なシチュエーションでの四捨五入を効率的に行うことができます。

しかし、その際には注意点やパフォーマンスの観点も考慮する必要があります。

四捨五入は数値計算の基本的な部分であり、Swiftをはじめとする多くのプログラム言語で頻繁に使用される機能です。

そのため、この記事で紹介した手法や知識をしっかりとマスターすることで、Swiftプログラミングの幅をさらに広げることができるでしょう。

日々の開発や学習の中で、最適な四捨五入の手法を選択し、より高品質なコードを実現してください。