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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

1770閲覧

変数の中身は同じなのに、同じと判定されません。

nankoko

総合スコア20

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/11/02 07:55

変数Aと、変数Bがあり中身は同じなのに
if(A == B)で、同じと判定されません。

GetType()すると、両方とも、System.Singleです。
数字は両方、1や、2や、3等では駄目ですが、0のみ同じと判定されます。
また、ToString()や、(float)でキャストしてやると、0以外の数字でも同じと判定されます。

何か原因は考えられますでしょうか?

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

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

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

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

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

papinianus

2018/11/02 07:58

精度では?例えばどういう計算をした値が入るものなのですか?座標?
nankoko

2018/11/02 08:07

お返事ありがとうをございます。自分も精度かと思ったのですが、floatにキャストしてやると同じと判定されるんです。値はunityのスライダーバーの値ですが、1や2や3で強制的にスナップされています。
guest

回答2

0

ベストアンサー

追記

次のように回答していましたが、System.Single は参照型でなく 別の問題だろうとご指摘をいただきました。(Zuishinさんありがとうございます)


文字列型の場合は値を比較しますが、そうでない参照型の場合はインスタンスが同じものかどうかで判断されます。ただし、==演算子や、!=演算子のふるまいを上書きしていないはその限りではありません。

組み込みの値型の場合、等値演算子 (==) ではオペランドの値が等しい場合に true が返され、それ以外の場合は false が返されます。 string 以外の参照型の場合、== では 2 つのオペランドが同じオブジェクトを参照する場合に true が返されます。 string 型の場合は、== は文字列の値を比較します。

ユーザー定義の値の型は == 演算子をオーバーロードできます (「演算子」を参照)。 ユーザー定義参照型もオーバーロードはできますが、既定では、組み込み参照型とユーザー定義参照型のいずれに対しても == は前述のとおりに機能します。 == をオーバーロードする場合は、!= もオーバーロードする必要があります。 整数型に対する演算は、通常、列挙型で使用できます。


引用元: == 演算子 (C# リファレンス) | Microsoft Docs

投稿2018/11/02 08:00

編集2018/11/02 08:19
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nankoko

2018/11/02 08:11

お返事ありがとうございます。数字が両方0なら同じと判定されるので そこらへんは問題ないかと思ったのですが、何か確認する方法はないでしょうか?
Zuishin

2018/11/02 08:14

私の貼ったリンク先の「等しいかどうかテスト」のところにヒントがあるかもしれません。
退会済みユーザー

退会済みユーザー

2018/11/02 08:14

Zuishinさん ご指摘ありがとうございます。回答を直しておこうと思います。
nankoko

2018/11/02 08:41

Zuishinさん、お返事ありがとうございます。 すみません、先程はppnさんへのお返事と前後してしまいました。 教えていたいだ通り、精度の問題でした! doubleにキャストしてやると、それぞれ 2.00000004768372 2.00000001788139 で、それぞれ違う数字が入っていました。 スッキリしました。ありがとうございます!
nankoko

2018/11/02 08:44

Zuishinさんをベストアンサーにしようと思ったのですが・・ ppnさんに対するコメントなので、出来ないようでした。。 すみません。。
Zuishin

2018/11/02 08:48

すみません。ややこしいことしました。 Unity だとどこで誤差が入るか私では解決できないので、回答できませんでした。 この回答のコメントで解決したのであれば、この回答をベストアンサーにしてください。 こんなに簡単に片付くとは思わなかったので、ppn さんには申し訳ないです。
退会済みユーザー

退会済みユーザー

2018/11/02 09:01 編集

スライダの値を整数に丸めて入れなおして、その値で比較しているので誤差うんぬんが効いてくるのかな?言うまでもないかもしれませんが、比較する際に改めて整数型に丸めて、その整数型で比較すればよさそうかな~と思いました。 >Zuishinさん いえいえ、こちらこそ申し訳ないです。回答立て直してもらっても大丈夫です。
Zuishin

2018/11/02 09:03

では自己解決を提案します。恥ずかしいので。
nankoko

2018/11/02 13:52

一日悩んでいたので、Zuishinさん有難うございました! おかげでスッキリした気持ちで週末を迎えられます。 m(_ _)m 他の方も、いろいろとアドバイス頂きありがとうございました。 とても勉強になりました。
edo_m18

2018/11/03 02:20

浮動小数点の比較の話は、最初は「?」になりがちですよね。 この誤差に関しては、Unityでは以下の関数を用意してくれています。浮動小数点の比較をしたい場合は常にこちらを利用するといいと思います。 [Mathf.Approximately] https://docs.unity3d.com/jp/460/ScriptReference/Mathf.Approximately.html
退会済みユーザー

退会済みユーザー

2018/11/04 07:09

edo_m18さん、情報ありがとうございます。ベクトルなどでも、自分で計算しなくていいように関数があったりと、そういった所で手厚いのがありがたいですね。
nankoko

2018/11/05 11:00

Mathf.Approximatelyは知りませんでした。 便利ですねー! ありがとうございます。使わせていただきます。
guest

0

GetType()すると、両方とも、System.Singleです。

もしかして、片方or両方がobjectでしょうか?

object型は参照型なのできちんとした型に戻してやらないと
object型の==演算子が用いられppnさんの言う通りの結果になります。


==演算子の代わりにEqualsメソッドを用いると結果が変わりませんか?

c#

1A.Equals(B);

投稿2018/11/02 13:15

編集2018/11/02 13:17
asm

総合スコア15147

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

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

nankoko

2018/11/02 13:49

今回は、以下みたいに微妙にそれぞれ違う数字でした。 2.00000004768372 2.00000001788139 doubleにキャストする事でわかりました。 いろいろ勉強になりました。有難うございます。
Zuishin

2018/11/02 13:54

object と Single の比較は == ではできないので、どちらかが object ならもう片方も object でしょうね。その場合は 0 も異なることになると思いますから、今回は違うと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問