前提・実現したいこと
iOS用の電卓アプリを作成しています。
浮動小数の誤差を解消するためにNSDecimalNumberを使用すれば良いというのは理解できたのですが、NSDecimalNumberをString型に変換するためにはどのようにすればよいのか見当がついていません。
NSDecimalNumberをString型に変換する方法についてご教示いただければ幸いです。
暫定的な対処方法
NSDecimalNumber型に近い結果を表示させるために、現在
- NSDecimalNumber型をDouble型に変換
- Double型をString型に変換
- String型に変換したものを計算結果表示用ラベルに代入
という方法をとっています。
しかし、この方法では整数同士の計算でも余計な小数点がついてしまったり、計算によっては誤差が出てしまったりするため、それを解消するためにNSDecimalNumber型を直接String型に変換したいです。
↓掛け算のコード
swift
1var kakeru1:NSDecimalNumber = NSDecimalNumber(value: previousNumber)//previousNumber=計算式の左辺。Double型のため、NSDecimalNumberに変換 2var kakeru2:NSDecimalNumber = NSDecimalNumber(value: numberOnScreen)//numberOnScreen=計算式の右辺。Double型のため、NSDecimalNumberに変換 3var kakeruresult = kakeru1.multiplying(by: kakeru2)//掛け算 4var kakeruresult2:Double = Double(kakeruresult)//NSDecimalNumber型の結果をDouble型に変換 5Result.text = String(kakeruresult2)//Result=電卓の計算結果表示用ラベル
###追記
y_waiwai様からコメントでいただいたリンクを元に、以下のようにコードを変更いたしました。
swift
1var leftNumber = NSDecimalNumber()//計算式の左辺 2var rightNumber = NSDecimalNumber()//計算式の右辺 3var calculateResult = [String]() 4 5calculateResult = [leftNumber.multiplying(by: rightNumber).stringValue] 6Result.text = String(calculateResult) 7
このように記述をしたところ、以下のようなエラーが表示されました。
Initializer 'init(_:)' requires that '[String]' conform to 'LosslessStringConvertible'
どうやらLosslessStringConvertibleというプロトコルの宣言をする必要があるみたいだったので、以下のコードも追加いたしました。
swift
1class ViewController: UIViewController,LosslessStringConvertible { 2 required init?(_ description: String) { 3 4 } 5 6 required init?(coder: NSCoder) { 7 fatalError("init(coder:) has not been implemented") 8 }
ここまで行ったのですが、ググってみてもどのようにすれば見当がつかない状態になっています。
最終的に[String]型をString型に変換したいのですが、どのようにすればいいのでしょうか?
回答1件
あなたの回答
tips
プレビュー