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

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

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

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

Xcode

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

Swift

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

浮動小数点

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

Q&A

解決済

1回答

1265閲覧

Swiftで10から0.1ずつカウントして0で止まるカウントアプリを作りたい

YuukiIbata

総合スコア15

COUNT

COUNT は、広く使用されているSQLの関数です。COUNT関数は、行数、もしくは配列のエンティティの数をカウントします。

Xcode

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

Swift

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

浮動小数点

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

0グッド

0クリップ

投稿2018/09/14 10:18

前提・実現したいこと

環境はXcode9.4.1 Swift4.0です。
1ずつ動かして止めることはできますが、浮動小数点の誤差によって、0.1ずつだとうまく止められません。
対応方法を教えてもらえると助かります・・・。
そもそもアプリを作ってみたいだけなので、このコードを直したものでなくても大丈夫です!

発生している問題・エラーメッセージ

0.1ずつ動かすと0で止まらない。
そもそも0.1ずつ表記が動かず、1ずつ数字が減っていってしまう。

該当のソースコード

Swift4.0

1import UIKit 2 3class ViewController: UIViewController { 4 @IBOutlet weak var countLabel: UILabel! 5 @IBOutlet weak var gameOver: UILabel! 6 @IBOutlet weak var backImage: UIImageView! 7 //時間計測用の変数 8 var count : Float = 10 9 10 //タイマー 11 var timer:Timer! 12 13 14 override func viewDidLoad() { 15 16 super.viewDidLoad() 17 gameOver.isHidden = true 18 backImage.isHidden = true 19 20 // Do any additional setup after loading the view, typically from a nib. 21 22 } 23 24 override func didReceiveMemoryWarning() { 25 super.didReceiveMemoryWarning() 26 // Dispose of any resources that can be recreated. 27 } 28 29 //タイマー起動のための中身 30 @objc func onUpdate(timer:Timer){ 31 32 //カウント増減を実施 33 count -= 1 34 35 //桁数を指定するコード 36 let str = String(format: "%.0f",count) 37 38 //countlabelに表示するコード 39 countLabel.text = str 40 41 //countlabelが0になったらタイマーを止めてgameoverが表示されるようにする 42 if count == 0 { 43 44 timer.invalidate() 45 gameOver.isHidden = false 46 self.view.sendSubview(toBack: backImage) 47 backImage.isHidden = false 48 49 } 50 51 } 52 53 54 @IBAction func startButton(_ sender: Any) { 55 56 timer = Timer.scheduledTimer(timeInterval: 1, target: self, selector: #selector(ViewController.onUpdate(timer:)), userInfo: nil, repeats: true) 57 58 } 59 60 61} 62 63

試したこと

if count == 0を、
if count <= 0にしてみたが、止まる時の表記が-0になってしまう。

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

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

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

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

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

guest

回答1

0

ベストアンサー

そもそも0.1ずつ表記が動かず、1ずつ数字が減っていってしまう。

swift

1count -= 1

-1しているので1ずつ数字が減るのは当たり前です。

swift

1String(format: "%.0f",count)

しかもこれでは小数点以下は表示されません。

解決方法

誤差のこともあるのでcountを整数で持つことにします。
表示のときに10で割れば小数第一位まで表現できます。

swift

1var count: Int = 100 2while count > 0 { 3 count -= 1 4 print(String(format: "%.1f", Double(count)/10.0)) 5}

text

19.9 29.8 39.7 4 : 50.2 60.1 70.0

Float版の対症療法

abs()使って絶対値で表示します。

swift

1var count: Float = 10.0 2while count > 0 { 3 count -= 0.1 4 print(String(format: "%.1f", abs(count))) 5}

text

1 : 20.2 30.1 40.0

投稿2018/09/14 10:37

編集2018/09/14 11:29
fuzzball

総合スコア16731

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

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

YuukiIbata

2018/09/16 05:30

お礼が遅くなりました。fuzzball様のアドバイスのおかげで無事完成させることができました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問