質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

Q&A

解決済

1回答

4892閲覧

NSDecimalNumberをStringに変換する方法

ysda

総合スコア65

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

0グッド

0クリップ

投稿2019/10/23 01:24

編集2019/10/23 02:38

前提・実現したいこと

iOS用の電卓アプリを作成しています。
浮動小数の誤差を解消するためにNSDecimalNumberを使用すれば良いというのは理解できたのですが、NSDecimalNumberをString型に変換するためにはどのようにすればよいのか見当がついていません。
NSDecimalNumberをString型に変換する方法についてご教示いただければ幸いです。

暫定的な対処方法

NSDecimalNumber型に近い結果を表示させるために、現在

  1. NSDecimalNumber型をDouble型に変換
  2. Double型をString型に変換
  3. 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型に変換したいのですが、どのようにすればいいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasakiHori

2019/10/23 02:49

[leftNumber.multiplying(by: rightNumber).stringValue]の [] が不要です。
ysda

2019/10/23 02:54

ご回答ありがとうございます。 []を削除してうまくいきました。
guest

回答1

0

ベストアンサー

NSDecimalNumberの簡単なまとめ

ではどうでしょう

投稿2019/10/23 01:50

y_waiwai

総合スコア87747

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ysda

2019/10/23 02:39

ご回答ありがとうございます。 いただいたリンクを元にコードを変更してみたところ、 [String]型をString型に変換する方法がわからない状態になりました。 質問の追記欄にその内容を記載いたしました。 もしよろしければこちらの内容に関してもご助言いただければ幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問