はじめに
実務の中で、小数同士の計算時に誤差が生じてしまい解決に時間がかかったため、備忘録を残します。
原因
まず以下の計算をすると普通0.02になるかと思います。
let n1:Double = 10.36
let n2:Double = 10.34
let n3:Double = n1 - n2
print(n3) // 0.019999999999999574
しかし結果は、0.01999...4
なんで???
どうやら、
浮動小数点数は二進数で表現されるようなので、十進数で表現できる数値を正確に表すことができないようです。
解決方法
解決方法としては、以下のように 「NSDecimalNumber」 を使って解決しましょう!
今回は減算の計算でしたが、加算や乗算などの計算も可能です。
let n1:Double = 10.36
let n2:Double = 10.34
let d1:NSDecimalNumber = NSDecimalNumber(string: "\(n1)")
let d2:NSDecimalNumber = NSDecimalNumber(string: "\(n2)")
let sub:NSDecimalNumber = d1.subtracting(d2)
print(d3) // 0.02
四則演算メソッド
以下の4つ以外にも、累乗などのメソッドも提供してくれているのでドキュメントなどで確認してみてください!
加算
let add:NSDecimalNumber = d1.adding(d2)
減算
let sub:NSDecimalNumber = d1.subtracting(d2)
乗算
let mul:NSDecimalNumber = d1.multiplying(by: d2)
除算
let div:NSDecimalNumber = d1.dividing(by: d2)
参考資料