- PR -

PointFの型変換

投稿者投稿内容
toto
常連さん
会議室デビュー日: 2005/10/18
投稿数: 46
お住まい・勤務地: 岡山
投稿日時: 2006-08-18 10:05
ASP.NETでグラフを表示する為、サードパーティのソフトを使用としています。
この際にPointF構造体を使用して表示を行うのですが、大きな数字が入ると、グラフに正しく表示されません。
具体的には、Y座標に「26,063,895,231」の値を代入すると、グラフでは、「26,063,894,528」にポイントが表示されます。
これは、予想するにPointFのY座標がSingleまでしか入らないから?

コード:

Dim dateview As New DataView(dataSet1.Tables("dataSet1"))

' チャートにデータを代入する
Dim data As PointF() = CType(Array.CreateInstance(GetType(PointF), rowCount), PointF())
Dim i As Integer

For i = 0 To data.Length - 1
Dim y As Long = Long.Parse(dateview(i)("SUM").ToString())
data(i) = New PointF(i, y)
Next i

Dim series As ChartDataSeries = graph.ChartGroups(0).ChartData.SeriesList(0)
series.PointData.CopyDataIn(data)



大きな勘違いをしている様な、気もいたしますが、何卒宜しくお願いいたします。

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

toiryさんの書き込み (2006-08-18 10:05) より:

ASP.NETでグラフを表示する為、サードパーティのソフトを使用としています
(snip)
これは、予想するにPointFのY座標がSingleまでしか入らないから?


"サードパーティのソフト" が、具体的に何であるかはわかりませんが...

引用:

MSDN2 ライブラリ - System.Single 構造体 より:

Single 値型は、-3.402823e38 から +3.402823e38 までの単精度 32 ビット数と、正の 0 または負の 0、PositiveInfinity、NegativeInfinity、および非数 (NaN) を表します。


とのことですから、メイン プログラム側でどうこうという問題ではないような気がしますが...

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
きよの
常連さん
会議室デビュー日: 2004/02/07
投稿数: 34
投稿日時: 2006-08-18 11:40
引用:

toiryさんの書き込み (2006-08-18 10:05) より:
これは、予想するにPointFのY座標がSingleまでしか入らないから?



コード:
  Single f = 26063895231f;
  Console.WriteLine(string.Format("{0:####################}", f));


C# ですが、こんなコードを実行すると。26063890000 と表示されますから、Single の精度の問題ではないかと。
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-08-18 11:57
引用:

toiryさんの書き込み (2006-08-18 10:05) より:

これは、予想するにPointFのY座標がSingleまでしか入らないから?


PointFというよりも、単純に Long型の値をFloat型に入れた場合の問題かと。
Long型に値を入れて、Float型にキャストするだけで再現できますよ。

#ボクの場合は、グラフは形を再現できれば良いので、大きな値を扱うときは千円単位などにしちゃいます。

[ メッセージ編集済み 編集者: R・田中一郎 編集日時 2006-08-18 11:59 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-08-18 12:37
引用:

R・田中一郎さんの書き込み (2006-08-18 11:57) より:
PointFというよりも、単純に Long型の値をFloat型に入れた場合の問題かと。


これってどういう意味(というか意図)ですか…?
単なるSingleの有効桁数の問題だと思いますが…
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-08-18 12:40
引用:

toiryさんの書き込み (2006-08-18 10:05) より:
コード:
        Dim data As PointF() = CType(Array.CreateInstance(GetType(PointF), rowCount), PointF())




本題とは関係ないですが、なんでわざわざこんなことしてるんでしょ?
toto
常連さん
会議室デビュー日: 2005/10/18
投稿数: 46
お住まい・勤務地: 岡山
投稿日時: 2006-08-18 13:00
皆様、返信ありがとうございます。

ウォッチで見ると

Dim y As Long → 26063895231
data(0) → 2.60638945E+10

となっていたので、精度の問題かと。(根本的に考え方が違うのかな)
toto
常連さん
会議室デビュー日: 2005/10/18
投稿数: 46
お住まい・勤務地: 岡山
投稿日時: 2006-08-18 13:04
>なちゃさん

引用:

なちゃさんの書き込み (2006-08-18 12:40) より:
引用:

toiryさんの書き込み (2006-08-18 10:05) より:
コード:
        Dim data As PointF() = CType(Array.CreateInstance(GetType(PointF), rowCount), PointF())




本題とは関係ないですが、なんでわざわざこんなことしてるんでしょ?




これ、サンプルのコードをそのまま記載しているのですが、あまり意識していませんでした。。。
なんで、こんな事をしているのだろう?

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