Swiftに限ったことではないが、小数(Float, Double)の計算ではとても細かい誤差がでる。
これの理由はSwiftに限ったことではないので割愛するが、気になる人は以下の記事などがわかりやすいかと思う。
Swiftで小数(Float, Double)での浮動小数点誤差が出る計算
1 2 3 4 5 6 7 |
let d1: Double = 3.14 let d2: Double = 3.13 print(d1 - d2) // 0.0100000000000002 let f1: Float = 3.14 let f2: Float = 3.13 print(f1 - f2) // 0.00999999 |
出力結果を見ればわかるように誤差が生じ、思い通りの計算結果にならない。
これを解決するには NSDecimalNumber を使えば良い。
Swiftで小数の誤差をなくすためにNSDecimalNumberを使う
1 2 3 |
let n1 = NSDecimalNumber(string: "3.14") let n2 = NSDecimalNumber(string: "3.13") print(n1.subtracting(n2)) // 0.01 |
このように厳密な計算を行う必要がある場合は、NSDecimalNumberを使うことを覚えておこう。