xyk blog

最近は iOS 開発の記事が多めです。

Swift の Float(CGFloat) や Double で小数点の丸め処理を行う

検証環境:
Xcode 12.4
Swift 5.3.2

Swift の浮動小数点数型である Float(CGFloat) や Double で小数点の切り捨て、切り上げ、四捨五入などの丸め処理をするには Swift3 から追加された FloatingPoint プロトコルの extension に定義されている roundedメソッドを使えばよい。
(roundメソッドもあるが、roundedが非破壊メソッドであるのに対しroundは破壊メソッドとなる)
ちなみに以前はceil(切り捨て)、floor(切り上げ)、round(四捨五入)のグローバルな関数を使っていた。

引数なし rounded

Float

func rounded() -> Float

Double

func rounded() -> Double

引数なし rounded メソッドは四捨五入される。
0.5より小さければ切り捨て、0.5より大きければ切り上げ、ちょうど0.5なら0から遠い方の数値へ丸める。

実行例

(5.2).rounded()
// 5.0
(5.5).rounded()
// 6.0
(-5.2).rounded()
// -5.0
(-5.5).rounded()
// -6.0

引数あり rounded

Float

func rounded(_ rule: FloatingPointRoundingRule) -> Float

Double

func rounded(_ rule: FloatingPointRoundingRule) -> Double

引数の enum である FloatingPointRoundingRule には

  • up
  • down
  • toNearestOrAwayFromZero
  • toNearestOrEven
  • towardZero
  • awayFromZero

の6つが定義されている。

rounded(.up)

切り上げ。大きい方の数値に丸める。

実行例

(5.2).rounded(.up)
// 6.0
(5.5).rounded(.up)
// 6.0
(-5.2).rounded(.up)
// -5.0
(-5.5).rounded(.up)
// -5.0

rounded(.down)

切り下げ。小さい方の数値に丸める。

実行例

(5.2).rounded(.down)
// 5.0
(5.5).rounded(.down)
// 5.0
(-5.2).rounded(.down)
// -6.0
(-5.5).rounded(.down)
// -6.0

rounded(.towardZero)

0に近い数値に丸める。

実行例

(5.2).rounded(.towardZero)
// 5.0
(5.5).rounded(.towardZero)
// 5.0
(-5.2).rounded(.towardZero)
// -5.0
(-5.5).rounded(.towardZero)
// -5.0

rounded(.awayFromZero)

0から遠い数値に丸める。

実行例

(5.2).rounded(.awayFromZero)
// 6.0
(5.5).rounded(.awayFromZero)
// 6.0
(-5.2).rounded(.awayFromZero)
// -6.0
(-5.5).rounded(.awayFromZero)
// -6.0

rounded(.toNearestOrAwayFromZero)

schoolbook rounding(教科書の丸め?)と呼ばれる丸め規則に従う。[参照]

最も近い許容値に丸めます。2つの値が等しく近い場合は、大きさが大きい方が選択されます。

0.5より小さければ切り捨て、0.5より大きければ切り上げ、ちょうど0.5なら0から遠い(AwayFromZero)方の数値へ丸める。

こちらは引数なしのrounded()と同じ挙動であり四捨五入となる。

実行例

(5.2).rounded(.toNearestOrAwayFromZero)
// 5.0
(5.5).rounded(.toNearestOrAwayFromZero)
// 6.0
(-5.2).rounded(.toNearestOrAwayFromZero)
// -5.0
(-5.5).rounded(.toNearestOrAwayFromZero)
// -6.0

rounded(.toNearestOrEven)

bankers rounding(銀行家の丸め?)と呼ばれる丸め規則に従う。[参照]

最も近い許容値に丸めます。2つの値が等しく近い場合は、偶数の値が選択されます。

0.5より小さければ切り捨て、0.5より大きければ切り上げ、ちょうど0.5なら偶数(Even)となる方の数値へ丸める。

実行例

(5.2).rounded(.toNearestOrEven)
// 5.0
(5.5).rounded(.toNearestOrEven)
// 6.0
(4.5).rounded(.toNearestOrEven)
// 4.0
(-5.2).rounded(.toNearestOrEven)
// -5.0
(-5.5).rounded(.toNearestOrEven)
// -6.0
(-4.5).rounded(.toNearestOrEven)
// -4.0

参考

Float
developer.apple.com

CGFloat
developer.apple.com

Double
developer.apple.com

Proposal github.com