[Swift] Double での 剰余計算

Swift

     

TAGS:

⌛️ < 1 min.
Swift では、Double に %(剰余計算) が使えなくなっていました。代替の方法を説明します。

整数値で揃えたい時もそうですが、Doubleの数列を使っていると、0.5刻みで揃えたいとかあります。

データがあって、そのデータを表示するための表示域を決めるときがその1つです。

たとえば、、0.3, 0.4, 0.7, 0.9, 1.3 というようなデータを表示するときに、[0.0,1.5]を表示値域としたい というようなケースです。

0.5刻みで数値を含む範囲を計算する

ちょっとごちゃごちゃしてますが、剰余計算を自前でしているだけです。

let minValue = ...
Let maxValue = ...
let axisMinValue = Double(Int(minValue/0.5))*0.5 - 0.5
let axisMaxValue = Double(Int(maxValue/0.5))*0.5 + 1.0

0.5 での剰余計算をして、切り捨てているため、境界上にデータがあると、グラフとしては見づらくなってしまうために、表示域を -0.5, +1.5 しています。

厳密に範囲を調整したい時は、ちょうど割り切れたかどうかの判定を加える必要があります。(ただ、Double の数値では、ちょうど割り切れるの定義が必要ですよね)

extensionにしておくと便利

以下のようなextensionにしてたまに使ってます。

extension Double {
    func align(step: Double) -> Double {
        return Double(Int(self/step))*step
    }
}

代替メソッドも用意されてました

普通に調べれば載ってます・・・

truncatingRemainder


func truncatingRemainder(dividingBy other: Double) -> Double

Apple のドキュメントは、こちら

似たメソッドもあります

少し動作のことなるメソッドも作られてました。

remainder


func remainder(dividingBy other: Double) -> Double

truncatingRemainder との動作の違いは、剰余の絶対値をできるだけ小さくするために、オーバーシュートもすることです。(剰余として負の数を取り得ます)

example code


13.0.truncatingRemainder(dividingBy: 5)  // 3
13.0.remainder(dividingBy: 5)            // -2

2つ目の例は、剰余の絶対値を小さくするために、剰余が負になっているのがわかります。

まとめ

Swift での Double の剰余演算
  • % の代替は、truncatingRemainder が用意されている
  • 剰余の絶対値を小さくする remainder も用意されていて、ケースによっては便利

説明は以上です。
不明な点やおかしな点ありましたら、ご連絡いただけるとありがたいです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です