0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Swift】浮動小数計算時の誤差を無くす方法

Posted at

はじめに

実務の中で、小数同士の計算時に誤差が生じてしまい解決に時間がかかったため、備忘録を残します。

原因

まず以下の計算をすると普通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)

参考資料

0
2
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?