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

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

詳細はこちら
Xcode

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

Swift

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

Q&A

解決済

1回答

828閲覧

if文でのDouble型数値の計算方法を教えてください。

YUSAA

総合スコア11

Xcode

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

Swift

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

0グッド

0クリップ

投稿2021/03/04 06:01

前提・実現したいこと

健康管理アプリを開発しています。
平熱温度と入力体温(本日の体温)との差分を計算し、
差分に応じた画像を表示したいのですが表示されません。
if文でのDouble型数値同士の計算方法について具体的に教えていただけると嬉しいです。

(ソースコードの説明)
numberRow・・・入力体温(本日の体温)
heinetuRow・・・平熱温度

該当のソースコード

Swift

1 2class healthViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 3 4 @IBOutlet weak var healthTableView : UITableView! 5 6 var healthNumber1 = [Double]() 7 8 var heinetuDate = [Double]() 9 10 var numberRow : Double = 0.0 11 12 var heinetuRow : Double = 0.0 13 14 var healthNum : Double = 0.0 15 16 var heinetuNum : Double = 0.0 17 18 var add2HealthNumber : Double = 0.0 19 20 var add2HeinetuNumber : Double = 0.0 21 22 override func viewDidLoad() { 23 super.viewDidLoad() 24 25 add2HealthNumber = numberRow 26 print(numberRow) 27 28 add2HeinetuNumber = heinetuRow 29 print(heinetuRow) 30 31 let nib = UINib(nibName: "healthTableViewCell", bundle: nil) 32 healthTableView.register(nib, forCellReuseIdentifier: "healthTableViewCell") 33 34 if #available(iOS 13.0, *) { 35 self.overrideUserInterfaceStyle = .light 36 } else { 37 // Fallback on earlier versions 38 } 39 } 40 41 override func viewDidAppear(_ animated: Bool) { 42 self.healthTableView.reloadData() 43 } 44 45 46 func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 47 return 1 48 } 49 50 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 51 52 //変数を作る 53 let cell = tableView.dequeueReusableCell(withIdentifier: "healthTableViewCell") as! healthTableViewCell 54 //変数の中身を作る 55 if numberRow < heinetuRow + 3.9 { 56 57 cell.healthImage.image = UIImage(named: "Kenko") 58 } 59 if numberRow > heinetuRow + 4.0 { 60 61 cell.healthImage.image = UIImage(named: "Binetu") 62 } 63 if numberRow > heinetuRow + 9.0 { 64 65 cell.healthImage.image = UIImage(named: "Hatunetu") 66 } 67 if numberRow > heinetuRow + 14.0 { 68 69 cell.healthImage.image = UIImage(named: "Kounetu") 70 } 71 72 return cell 73 } 74 75 76 77 78}

試したこと

numberRowとheinetuRowの引き算は出来なかったので、heinetuRowを右側に持ってきて計算するようにしました。

補足情報(FW/ツールのバージョンなど)

Xcodeバージョン12.4

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

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

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

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

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

TsukubaDepot

2021/03/04 06:05

Double 型同士の演算は可能です。 https://developer.apple.com/documentation/swift/double/floating-point_operators_for_double > numberRowとheinetuRowの引き算は出来なかったので、heinetuRowを右側に持ってきて計算するようにしました。 引き算ができなかった、と判断した理由はどのような理由でしょうか。 エラーがでたということでしょうか。それとも想定した通りの結果にならなかったということでしょうか。 最初に記述した内容と、エラがーで出たのであればその詳細も書いていただいた方がいいかと思います。
YUSAA

2021/03/04 06:12 編集

回答ありがとうございます。 すみません。引き算が出来なかったと記入したのですが、再度確認したところ出来ました。
hoshi-takanori

2021/03/04 06:38

その条件だと、numberRow が heinetuRow + 3.9 〜 heinetuRow + 4.0 の範囲だと何も表示されないのでは…。
YUSAA

2021/03/04 06:49

体温データが小数第一位までなので問題ないかなと思ったのですが。
hoshi-takanori

2021/03/04 07:18 編集

例えば heinetuRow が 36.0 で numberRow が 39.9 や 40.0 の場合は? (39.9 に関しては誤差の関係で Kenko になる可能性があるかも知れませんが…。) ((ってか、平熱 36.0℃ の人が 39.8℃ でも健康ってどうなんでしょう。摂氏ですよね?))
YUSAA

2021/03/04 08:09

ご指摘ありがとうございます。数値ミスをしておりました。差分4.0 9.0 14.0ではなく、0.4、0.9 1.4でした。
hoshi-takanori

2021/03/04 08:12

その差分が「より大きい (>)」なのか「以上 (>=)」なのかも確認した方がいいと思いますよ。
TsukubaDepot

2021/03/04 08:40

コメントが付いている間に図で説明をつくってしまいました。いつも入れ違いですいません。
YUSAA

2021/03/04 12:17

図でわかりやすく説明していただきありがとうございます。
TsukubaDepot

2021/03/04 14:27

逆にいうと、「図示する」ことが自分にとってもわかりやすくなるということがわかっていただけるのではないでしょうか。 本当はベン図、それに加えてカルノー図が描けるようになると複雑な判定式も容易に記述することができますので、ぜひ調べてみてもらえますでしょうか。
YUSAA

2021/03/05 00:55

わかりました。調べてみます。
guest

回答1

0

ベストアンサー

hoshi-takanoriさんがご指摘されていることを図示してみます。

イメージ説明

質問者さんが作られている条件式を図示すると、このような感じになります。
この図において、○印(しろまる)は、「その点を含まない」という意味です。
一方、この図にはありませんが、●(くろまる)は、「その点を含む」という意味です。

そうすると、現状の式では 0.39 から 0.4 の間については動作が未定義ですよね、というのが hoshi-takanori さんのご指摘です。

シンプルに考えると

  1. 平熱より +0.4 度未満は「Kenko」
  2. 平熱より +0.9 度未満は「Binetsu」
  3. 平熱より +1.4 度未満は「Hatunetu」
  4. それ以上は「高熱」

と書き換えられるはずです。
扱っている値は実数(Double型)なので、値としては 0.39 から 0.4 の間の値もとり得ます(ご自身で 0.39 と小数点以下2桁で打ち切ったつもりでも、計算は指定された範囲で行われます)。

なので、

Swift

1 if numberRow < heinetuRow + 0.4 {  2 cell.healthImage.image = UIImage(named: "Kenko") 3 } else if numberRow < heinetuRow + 0.9 { 4 cell.healthImage.image = UIImage(named: "Binetu") 5 } else if numberRow < heinetuRow + 1.4 { 6 cell.healthImage.image = UIImage(named: "Hatunetu") 7 } else { 8 cell.healthImage.image = UIImage(named: "Kounetu") 9 }

という具合に書き換えれば良いのではないでしょうか。
分かりにくければ、冒頭の図と同じような図を書き起こしてみるとよいのではないでしょうか。

一つ大切なのは、不等号の方向を揃える、ということです。

計算式があっていれば、不等号の方向はバラバラでも正しく計算できるのですが、人間が目視したときにわかりづらくなってしまいます。

また、変数名ももっとわかりやすい名前にした方が良いと思います。

また上記のような書き方は switch-case と範囲型の演算子(レンジ型)を使って判定することも可能です。

ただ、いずれにしても実数を扱っていると境界条件の設定が結構大変です。
古い記事ですが、計算誤差については下記の様な内容が参考になると思います。
2.35 – 2.34 = 0.01 にならない という例題で説明してあります。

投稿2021/03/04 08:39

編集2021/03/04 14:24
TsukubaDepot

総合スコア5086

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

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

TsukubaDepot

2021/03/04 14:25

いつものことながら、これは本来hoshi-takanoriさんがベストアンサーの案件なのですが...
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問