- PR -

Float→Doubleの型変換について(C#)

投稿者投稿内容
かい
常連さん
会議室デビュー日: 2003/05/27
投稿数: 34
投稿日時: 2006-12-04 20:53
お世話になっています。

Float→Doubleの型変換を行った時、ゴミが付加されてしまい
困っています。
ゴミが付加されないような変換は可能なのでしょうか?
ご存じの方がいましたら、対策を教えてください。

<サンプル>
float ansF = 1234.5F
double ansD ;

ansD = ansF ;

ansDで、「1234.5」と取得したい
 →現状は、「1234.5000244140625」となる


<試行1.キャストする>
float ansF = 1234.5F
double ansD ;

ansD = (double)ansF ;
 →状況は変わらず

<試行2.Convertする>
float ansF = 1234.5F
double ansD ;

ansD = Convert.ToDouble(ansF) ;
 →状況は変わらず

他に、どのような方法があるか分からない状態です。

よろしくお願いします。

以上
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-12-05 08:56
引用:

かいさんの書き込み (2006-12-04 20:53) より:

Float→Doubleの型変換を行った時、ゴミが付加されてしまい
困っています。
ゴミが付加されないような変換は可能なのでしょうか?
ご存じの方がいましたら、対策を教えてください。

<サンプル>
float ansF = 1234.5F
double ansD ;

ansD = ansF ;

ansDで、「1234.5」と取得したい
 →現状は、「1234.5000244140625」となる



コード:
	static class Program
	{
		static void Main() {
			float ansF = 1234.5F;
			double ansD ; 
			ansD = (double)ansF ;
			Console.WriteLine("----------------");
			Console.WriteLine(ansF);
			Console.WriteLine(ansD);
			Console.WriteLine("----------------");
		}
	}
----------------
1234.5
1234.5
----------------


ならなかったです。
環境が違うからかな?

Microsoft Visual C#2005 ですが。
_________________
R・田中一郎 -  R.Tanaka.Ichiro’s Blog
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-12-05 10:24
コード:
float ansF = 1234.5F;
double ansD;
ansD = ansF;

Console.WriteLine(ansF.ToString("F15"));
Console.WriteLine(ansD.ToString("F15"));


結果:
1234.500000000000000
1234.500000000000000

.NET Framework1.1ですが、ならないですね。
「ふたつの変数に値を設定して表示するだけ」の単純なプログラムでも同じようになりますか?
何か他の事をしているせいじゃないですか?
あと環境を教えてください。
Tdnr_Sym
ぬし
会議室デビュー日: 2005/09/13
投稿数: 464
お住まい・勤務地: 明石・神戸
投稿日時: 2006-12-05 11:04
こんにちは。

float ansF = 1234.5F
ではなく、違う数値なんでしょうね。
たとえば、

コード:
float ansF = 1234.3F;
double ansD ; 
ansD = ansF ;



では、ansDは「1234.300048828125」になります。
C#(.NET Framework1.1)、VC++.NET2003とも。

float型の有効桁数は約7桁なので、
それ以降の桁は無視すればいいのです。

浮動小数点数型と誤差

無視できないのであればDecimal型を使いましょう。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-12-05 11:09
浮動小数点数だし。。。
きれいに割り切れる値でも無い限り計算するときに誤差は出るでしょう。
でも 1234.5F だったらきれいに割り切れると思うんですけれどね。。。
_________________
かるあ のメモスニペット
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-05 11:14
double 型で使用したいのであれば、このようになります。

コード:

    float   value1 = 1234.3F;
    decimal value2 = (decimal)value1;
    double  result = decimal.ToDouble(value2);


しかし、最初から double 型で扱えば良いと思ったりもするわけですが。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-12-05 11:43
引用:

じゃんぬねっとさんの書き込み (2006-12-05 11:14) より:
double 型で使用したいのであれば、このようになります。

コード:

float value1 = 1234.3F;
decimal value2 = (decimal)value1;
double result = decimal.ToDouble(value2);




すみません、これってどういう意味ですか?


[ メッセージ編集済み 編集者: なちゃ 編集日時 2006-12-05 11:44 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-12-05 12:14
引用:

Tdnr_Symさんの書き込み (2006-12-05 11:04) より:

float型の有効桁数は約7桁なので、それ以降の桁は無視すればいいのです。


ただ単に 「無視」 するだとまずいかもしれません。
1234.6 の時とか、結果が変わってしまうような...
("無視" の意味合いが違うかもしれませんが)

引用:

なちゃさんの書き込み (2006-12-05 11:43) より:

すみません、これってどういう意味ですか?


浮動小数の誤差には疎い年代ですから、そう言われると不安になるのですが、
最終的に double 型に格納したいのであれば、という意味です。

確認せず書いているので、何か間違いがあるかもしれません。
なちゃさんからの突っ込みは勉強になりますから、何かありましたらご指摘ください。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌

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