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