ここから本文です

c# if文にfloatって使えないんですか?

kei********さん

2019/12/221:20:43

c#

if文にfloatって使えないんですか?

閲覧数:
63
回答数:
5

違反報告

ベストアンサーに選ばれた回答

prwssさん

2019/12/221:32:00

>if文にfloatって使えない

いいえ

使えます

***

このように書くと、if文が機能して無いかのように見えるので、その時はif文でfloatが使えないように見えますが、実はそのように見えているだけであり、それはただの錯覚です

KBx8U5 - Online C# Compiler & Debugging Tool - Ideone.com
https://ideone.com/KBx8U5

***


using System;

public class Test
{
public static void Main()
{
float a = 0.1f;
float b = 0.0f;

for(int i=0; i<10; i++){
b += 0.01f;
}

Console.WriteLine("a="+a);
Console.WriteLine("b="+b);

if(a == b){
Console.WriteLine("equals");
}else{
Console.WriteLine("not");
}

}
}

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜4件/4件中

並び替え:回答日時の
新しい順
|古い順

ajyantaさん

2019/12/310:16:30

「補足」
制御の分野ではfloat の==なんて怖くて使えません。<、>も同じ。

10倍とか100倍(要求される精度による。もちろん符号の反転やオーバーフローに注意)して 整数でやるか誤差を考慮するロジックにします。


yay********さんの回答のとおりです。

yay********さん

2019/12/308:40:01

>if文にfloatって使えないんですか?

いいえ。
ただし使うとバグを生むことは在る。

floatは実数なので少数以下は誤差が発生します。
(有限小数しか表現できないので、循環小数は必ず誤差が出ます。
PCは2進数なので表現できない数が存在する。)
そのため等号(==)で比較するのは良くない。
同様に以上以下の比較も正しく出来るとは限らない。

例)0.01足していっても1にならない


// Initialize two doubles with apparently identical values
double double1 = .33333;
double double2 = 1/3;
// Compare them for equality
Console.WriteLine(double1.Equals(double2)); // displays false


C言語ではお馴染みの2つの差分が極小だったら等しいとするロジックを実装する必要があります。
// Initialize two doubles with apparently identical values
double double1 = .333333;
double double2 = (double) 1/3;
// Define the tolerance for variation in their values
double difference = Math.Abs(double1 * .00001);

// Compare the values
// The output to the console indicates that the two values are equal
if (Math.Abs(double1 - double2) <= difference)
Console.WriteLine("double1 and double2 are equal.");
else
Console.WriteLine("double1 and double2 are unequal.");

https://docs.microsoft.com/ja-jp/dotnet/api/system.double.equals?vi...

ara********さん

2019/12/222:45:14

prwssさんが書いているのは、floatは2進法の小数なので10進数の小数を正確に表現できない(誤差を含んでいる)ということです。
消費税などで小数点以下の正確な計算が必要なら、10進小数のdecimalを使ってください。

Hermitさん

2019/12/221:42:24

bool 型でないと駄目なようです。
以下の様に、bool 型なら大丈夫です。

using System;
public class CommandLineSample {
    public static void Main(string[]args) {
        float a = 0.0F;
        float b = 1.0F;
        if (a == 0.0F)
             Console.Write("a は 0.0 です。\n");
        else
             Console.Write("a は 0.0 ではありません。\n");
        if (b == 0.0F)
             Console.Write("b は 0.0 です。\n");
        else
             Console.Write("b は 0.0 ではありません。\n");
    }
}

この質問につけられたタグ

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる