🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

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

Xcode

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

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

1回答

3167閲覧

【iOSアプリ】小数の表示設定をしたい

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++と共存することが意図されています

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2019/10/21 08:05

問題点

iOS電卓アプリを作成しています。
こちらのコードを参考に作成。数値がDouble型のため、整数同士の計算でも小数点が表示されています。
理想としては「8-6=0」

また、小数同士の加算減算を行うと、余計な「0」が表示された状態になっています。
理想としては「12.3-6.1=6.2」

小数同士の乗算除算だと計算結果自体がおかしな状態になっています。
理想としては「8.6×9.2=79.12」

こちらの内容が私の知りたい内容と近しいと思い、こちらを手がかりにググったりコードを足してみたりしたのですが、うまくいきませんでした。
上記の内容を解決するためのアドバイスや方法をご教示いただければ幸いです。

現在のコード(文字数の関係で不要な部分は削除しています)

swift

1 2import UIKit 3 4class ViewController: UIViewController { 5 6 var numberOnScreen:Double = 0 //入力した数字と計算結果 7 var previousNumber:Double = 0 //演算子の前の数字 8 var performingMath = false // 9 var operation = 0 10 var secondNumber = "" //[previousNumber + "演算子"] 11 var percentResult:Double = 0 //%格納用 12 var secondFormula:String = "" // 13 var equalFlag = true //=ボタン押下後のラベル表示結果制御用 14 var equalFlag2 = true //=ボタンを連続で押しても何も計算がされないように制御 15 var decimialFlag = true //計算結果に対して「.」を押すと「0.」にするためのフラグ 16 17 @IBOutlet weak var Result: UILabel! //入力した数字と計算結果表示用 18 @IBOutlet weak var formula: UILabel! //式を表示 19 20 override func viewDidLoad() { 21 super.viewDidLoad() 22 } 23 24 @IBAction func numbers(_ sender: UIButton) {//0~9までの文字 25 26 decimialFlag = true 27 28 if performingMath == true { 29 30 Result.text = "0" 31 32 if Result.text != "0"{ //計算結果に表示されている数字が0でなければ、直前の数字と入力した数字をつなげる 33 if equalFlag == true{ 34 Result.text = Result.text! + String(sender.tag-1) 35 formula.text = String(secondNumber) + formula.text! + String(sender.tag-1) 36 } 37 else { //=ボタン押した後 38 Result.text = String(sender.tag-1) 39 formula.text = String(sender.tag-1) 40 equalFlag = true 41 } 42 } else { //計算結果に表示されている数字が0であれば、入力した数字に書き換える 43 Result.text = String(sender.tag-1) 44 formula.text = String(secondNumber) + String(sender.tag-1) 45 } 46 47 performingMath = false 48 49 } 50 else { 51 52 if Result.text != "0" { //計算結果に表示されている数字が0でなければ、直前の数字と入力した数字をつなげる 53 if equalFlag == true{//=ボタンの前 54 55 Result.text = Result.text! + String(sender.tag-1) 56 formula.text = formula.text! + String(sender.tag-1) 57 58 } 59 else{//=ボタンの後 60 if Result.text == "0."{ 61 62 Result.text = Result.text! + String(sender.tag-1) 63 formula.text = formula.text! + String(sender.tag-1) 64 equalFlag = true 65 66 }else{ 67 68 Result.text = String(sender.tag-1) 69 formula.text = String(sender.tag-1) 70 equalFlag = true 71 72 } 73 } 74 } else { //計算結果に表示されている数字が0であれば、入力した数字に書き換える 75 Result.text = String(sender.tag-1) 76 formula.text = String(sender.tag-1) 77 } 78 } 79 } 80 81 @IBAction func decimalButton(_ sender: UIButton) { //小数点ボタン 82 83 if decimialFlag == false{ 84 Result.text = "0." 85 formula.text = "0." 86 decimialFlag = true 87 } 88 89 if Result.text == "" { //空白だった時 90 Result.text = "0." 91 } 92 else if Result.text == "+" { 93 Result.text = "+" 94 } 95 else if Result.text == "-" { 96 Result.text = "-" 97 } 98 else if Result.text == "×" { 99 Result.text = "×" 100 } 101 else if Result.text == "÷" { 102 Result.text = "÷" 103 } 104 else { //空白じゃなかった時 105 if (Result.text?.contains("."))!{ 106 Result.text = Result.text! + "" 107 formula.text = formula.text! + "" 108 } 109 else{ 110 Result.text = Result.text! + "." 111 formula.text = formula.text! + "." 112 } 113 } 114 } 115 116 117 @IBAction func calculateButton(_ sender: UIButton) { //演算子の入力 118 //演算子押す前の数字をpreviousNumberに代入 119 if performingMath == false { 120 if operatorCheck == true{ 121 previousNumber = Double(Result.text!)! 122 operatorCheck = false 123 124 if sender.tag == 14 { //÷を押した時 125 Result.text = "÷" //上のラベルに表示 126 formula.text = String(previousNumber) + "÷" //式のラベルに表示 127 } 128 if sender.tag == 15 { //×を押した時 129 Result.text = "×" 130 formula.text = String(previousNumber) + "×" 131 132 } 133 if sender.tag == 16 { //-を押した時 134 Result.text = "-" 135 formula.text = String(previousNumber) + "-" 136 } 137 if sender.tag == 17 { //+を押した時 138 Result.text = "+" 139 formula.text = String(previousNumber) + "+" 140 141 } 142 143 }else{ 144 145 Result.text = "" 146 formula.text = "" 147 148 } 149 150 } 151 152 operation = sender.tag 153 performingMath = true 154 plusminus = false //±の切り替え。次押した時にはマイナスになる 155 percentFormulaFlag = false 156 secondNumber = formula.text! //変数secondNumberに[previousNumber + "演算子"]を代入 157 equalFlag = true 158 equalFlag2 = true 159 plusminusFormulaFlag = true 160 161 } 162 163 @IBAction func anserButton(_ sender: UIButton) { //=ボタンを押した時 164 165 if equalFlag2 == false{ 166 Result.text = Result.text! + "" 167 formula.text = formula.text! + "" 168    }else{ 169 if Result.text == "+"||Result.text == "-"||Result.text == "÷"||Result.text == "×"{ 170 Result.text = Result.text! + "" 171 formula.text = formula.text! + "" 172 } 173 else{ 174 numberOnScreen = Double(Result.text!)!//上のラベルに表示してある数字をDouble型でnumberOnScreenに代入 175 if operation == 14 { //割り算 176 Result.text = String(previousNumber / numberOnScreen) 177 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber / numberOnScreen) 178 } 179 if operation == 15 { //掛け算 180 Result.text = String(previousNumber * numberOnScreen) 181 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber * numberOnScreen) 182 } 183 if operation == 16 { //引き算 184 Result.text = String(previousNumber - numberOnScreen) 185 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber - numberOnScreen) 186 } 187 if operation == 17 { //足し算 188 Result.text = String(previousNumber + numberOnScreen) 189 formula.text = secondNumber + String(numberOnScreen) + "=" + String(previousNumber + numberOnScreen) 190 } 191 } 192 } 193 194 } 195}

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

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

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

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

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

t_obara

2019/10/21 09:39

「swift 小数点 誤差」でググってみると参考になる情報が得られるのではないかと思います。
ysda

2019/10/22 23:49

アドバイスありがとうございます。 使えそうな内容が出てきたので試させていただきます。
guest

回答1

0

自己解決

数字をDouble型から、NSDecimalNumber型に変えてうまく行きました。
以下にコードの一部だけ掲載します。

swift

1@IBAction func anserButton(_ sender: UIButton) { //=ボタンを押した時 2 3 if equalFlag2 == false{ 4 5 Result.text = Result.text! + "" 6 formula.text = formula.text! + "" 7 8 }else{ 9 10 if Result.text == "+"||Result.text == "-"||Result.text == "÷"||Result.text == "×"{ 11 12 Result.text = Result.text! + "" 13 formula.text = formula.text! + "" 14 15 } 16 else{ 17 rightNumber = NSDecimalNumber(string: Result.text!)//上のラベルに表示してある数字をDouble型でnumberOnScreenに代入 18// leftNumber = NSDecimalNumber(value: previousNumber) 19// rightNumber = NSDecimalNumber(value: numberOnScreen) 20 if operation == 14 { //割り算 21 Result.text = leftNumber.dividing(by: rightNumber).stringValue//decimalをstringに変換 22 formula.text = leftNumber.stringValue + "÷" + rightNumber.stringValue + "=" + Result.text! 23 } 24 if operation == 15 { //掛け算 25 Result.text = leftNumber.multiplying(by: rightNumber).stringValue 26 formula.text = leftNumber.stringValue + "×" + rightNumber.stringValue + "=" + Result.text! 27 } 28 if operation == 16 { //引き算 29 Result.text = leftNumber.subtracting(rightNumber).stringValue 30 formula.text = leftNumber.stringValue + "-" + rightNumber.stringValue + "=" + Result.text! 31 } 32 if operation == 17 { //足し算 33 Result.text = leftNumber.adding(rightNumber).stringValue 34 formula.text = leftNumber.stringValue + "+" + rightNumber.stringValue + "=" + Result.text! 35 } 36 } 37 } 38 39 40 } 41 42 43} 44 45

投稿2019/10/24 01:36

ysda

総合スコア65

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問