2016-11-03 6 views
1

C++で初期化された変数に整数値または浮動小数点値があるかどうかを確認する方法はありますか?変数がC++の整数または浮動小数点かどうかチェック

サンプル・コード・ブロックを以下に示す:

int main() 
{ 
    double number = 9.99; 

    if (/*Checks whether the value of the 'number' is an integral*/) 
     cout << "The 'number' has an integral value"; 
    else 
     cout << "It's not an integral value" // This condition will true if 'number' has a floating point number 
    return 0; 

} 
+3

あなたは7.0を整数と見なしますか? – NathanOliver

+0

std :: modfを使用するhttp://en.cppreference.com/w/cpp/numeric/math/modfこれは重複する可能性がありますhttp://stackoverflow.com/questions/1521607/check-double-variable-if-it整数と非浮動小数点を含む – DejaVuSansMono

+1

整数値とは何ですか?整数値ですか? – mbaros

答えて

-1

これは、任意精度にこれを行うことにより、浮動小数点表現することは不可能です。イプシロンを定義してから:

if(abs(floor(number+0.5)-number) < epsilon) //is close enough to int 

フロアと+ 0.5は正の数値を丸めるのに有効です。私はあなたに否定的なままです。

+1

私はここで 'int'を使用しません。 'double'は' int'よりもかなり大きな値を保持することができるので、切り捨てるとデータが失われます。 – NathanOliver

+0

良いアイデア、私は編集します。 – kabanus

+0

ここでのロジックは根本的に欠陥があります。各浮動小数点値は実際には正確です。それは不正確な_操作_です。したがって、すべての浮動小数点値が実際には整数値であるかどうかを判断できますが、ここで提案されている「+ 0.5」は不正確です。その数が十分に大きく、 'nextafter(number)== number + 1'のような場合は、' number + 0.5-number == number + 1-number == 1'となります。しかし、これらの大きな数字はすべて実際には整数です! – MSalters

1

これはいかがですか?

#include <typeinfo> 

// … 
int a = 1; 
std::cout << typeid(a).name() << '\n'; 

typeid(a).name()iまたはintまたは任意の他のいずれかに等しいかどうかを確認できます。あなたのコンパイラによると、それはtypeid(a).name()と同じです。しかし、intfloatdoubleについて確認することができます。出力を確認して条件を作成できます。希望があれば

+0

私は、浮動小数点変数が値の中で「整数」であるかどうかを評価することが重要であると確信しています。 – kabanus

+1

これは 'std :: is_integral'よりどのように優れていますか? – MSalters

+0

私は、変数が整数かどうかをチェックする方法を理解しました。つまり、どのような型の変数なのかを確認する方法です。 –

2

あなたが探しているのはfmod(number, 1.0)です。これが正確に 0.0(ここではイプシロン)でない場合に限り、numberは整数値です。

+0

良い解決策、これについて忘れました。あなたが導入した注意書きは、ここでも失敗しないとは思えません。 – kabanus

関連する問題