- PR -

[C#] 整数なのか浮動小数点数なのか判断したい

投稿者投稿内容
Qoo
常連さん
会議室デビュー日: 2006/05/18
投稿数: 37
投稿日時: 2006-06-19 17:17
いつもお世話になっています。
表題の通り、あるDouble型の変数に入っている値が
11
12
などの整数なのか
11.15
12.25
などの小数点を含んだ値なのか判断して小数点がある数値ならそのまま、
ないなら".00"を付加して桁数を揃えたいのですが
うまくいきません。何かアイデアがあればご教授ください。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2006-06-19 17:27
 切り上げるか、切り捨てるかして、
値が変化しなければ、整数ですし、
変化すれば、少数ですね。

これ、ちょっと考えれば解るのでは?
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-06-19 17:29
こんにちは。

表題と本文が一致しませんが……
「判断したい」のか「桁数をそろえたい」のか。
とりあえず桁数をそろえるなら

コード:

Double x = 11.15;
Console.Write(x.ToString("0.00"));


こんな感じで。

参照:
http://msdn2.microsoft.com/ja-jp/library/kfsatb94.aspx
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-06-19 17:33
引用:

Qさんの書き込み (2006-06-19 17:17) より:

表題の通り、あるDouble型の変数に入っている値が
整数なのか小数点を含んだ値なのか判断して


いくつか方法はあります。
文字列として見て小数点以下を見るのも良いですし、
丸めた整数とで比較しても良いですね。(これは、精度によっては危険ですが)

ただ、

引用:

小数点がある数値ならそのまま、ないなら".00"を付加して桁数を揃えたいのですが
うまくいきません。何かアイデアがあればご教授ください。


これが目的であるならば、"浮動小数か整数か" などという判断は不要です。
何に使用されるのかはわかりませんが...

たとえば、ToString メソッドのオーバーロード一覧を見てください。
書式の設定ができるオーバーロードがあることに気付くハズです。
書式の整形という意味では、String.Format メソッドでも良いでしょう。

  指定の書式の文字列に変換する

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2006-06-19 18:23
引用:

 切り上げるか、切り捨てるかして、
値が変化しなければ、整数ですし、
変化すれば、小数ですね。



これは、浮動小数点を扱う際の典型的な誤りかと思います。
私は、浮動小数点を扱う時は基本的に、等号比較は行いません。

ただ、今回の話は単に表記の問題なので、ToString で解決しそうですね。

--- 参考コード
Dim x As Double = 1.3
Dim sum As Double = 0
Dim i As Integer
For i = 0 To 99
 sum += x
Next
Debug.WriteLine(sum)
If sum = Math.Round(sum) Then
 Debug.WriteLine("Equal")
Else
 Debug.WriteLine("Not Equal")
End If
Qoo
常連さん
会議室デビュー日: 2006/05/18
投稿数: 37
投稿日時: 2006-06-19 18:31
皆さん、早速のお返事ありがとうございます。

takuさんの言われた通り、最初はこんなの簡単だろうと思って

double x = 1.5;
x = x - int.Parse(x);

みたいな感じで、引き算してやればいいと思ってましたが
型が違うと怒られてました。(確かに違いますけど・・・ね)

上記のint.Parse(x)だと小数点以下を切り捨てるのにエラーが
出るのに、Convert.ToInt16メソッドを使ったところ何もエラーは
出ずに、値は整数に丸められてました。(少数点以下1桁で四捨五入してるみたいです。)

結局、Double型の数値をそのままToStringして文字列化したものと
Convert.ToInt16をToStringして文字列化したものを単純に文字列比較して
一致しなければ小数点有りと判断する事にしました。

みなさん、貴重なご意見ありがとうございました。
burton999
ぬし
会議室デビュー日: 2003/10/06
投稿数: 898
お住まい・勤務地: 東京
投稿日時: 2006-06-19 18:40
おそらく、taku氏がおっしゃってるのはこんな感じかと。
今回は桁数を整えたいとのことなので、文字列で処理するのが一番かとは思いますが。


コード:

double x = 1.5;
if (Math.Floor(x) == x)
{
//
// 整数
//
}
else
{
//
// 小数
//
}



[ メッセージ編集済み 編集者: burton999 編集日時 2006-06-19 18:45 ]
深山
ベテラン
会議室デビュー日: 2006/05/09
投稿数: 66
お住まい・勤務地: 都内某所
投稿日時: 2006-06-19 19:02
引用:

Qさんの書き込み (2006-06-19 18:31) より:

上記のint.Parse(x)だと小数点以下を切り捨てるのにエラーが
出るのに、Convert.ToInt16メソッドを使ったところ何もエラーは
出ずに、値は整数に丸められてました。(少数点以下1桁で四捨五入してるみたいです。)



Math.Roundでもそうですが、「四捨五入」ではなく「偶数丸め」の整数が返されます。

スキルアップ/キャリアアップ(JOB@IT)