C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

大きな数値のcsvファイルへの書き込み

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■88771 / inTopicNo.1)  大きな数値のcsvファイルへの書き込み
  
□投稿者/ なつ (18回)-(2018/09/25(Tue) 21:17:33)

分類:[VB.NET/VB2005 以降] 

いつも初歩な質問ですみません。
Windows 10、VB 2017 、csvファイルです。


下記を実行し Excelまたはメモ帳で開くと、どちらも 2.07835E+09 となりますが、
これをそのまま 2078350000 にするにはどのようにすれば良いのですか?

   Using sr As New System.IO.StreamWriter(filename, False, System.Text.Encoding.Default)
       Dim dat As Single = 2078350000
       sr.WriteLine(dat)
       sr.Close()
   End Using

引用返信 編集キー/
■88773 / inTopicNo.2)  Re[1]: 大きな数値のcsvファイルへの書き込み
□投稿者/ shu (1141回)-(2018/09/26(Wed) 06:42:04)
No88771 (なつ さん) に返信

> Dim dat As Single = 2078350000
Singleではなく IntegerかLongかDecimalにするとよいと思います。
Excelはそれでもセル幅が狭いとEの表記になります。
引用返信 編集キー/
■88774 / inTopicNo.3)  Re[2]: 大きな数値のcsvファイルへの書き込み
□投稿者/ 魔界の仮面弁士 (1863回)-(2018/09/26(Wed) 09:01:20)
No88773 (shu さん) に返信
>> Dim dat As Single = 2078350000
> Singleではなく IntegerかLongかDecimalにするとよいと思います。

あるいは Dim dat As String = "2078350000" という手も。


> Excelはそれでもセル幅が狭いとEの表記になります。

さらに補足すると、Single 型の有効桁数は 24bit 相当しかありません。
そしてこれは、10進数で 約 7.22471989594 桁分に相当します。

一方、「2078350000」は 10 桁分ですから、有効桁数として不足し、
Single 型だと 2.07835E+09 などの表記になってしまっていたということです。


結局のところ、Single 型では 2078350000 という値を正確に表せません。

これが Double 型であれば、有効桁数は 53bit 相当ですから、
10 進数としては 約 15.9545897702 桁となり、
「2078350000」という値でも誤差なく保持できたのですが。

とはいえ、10 進数として正確に表したいなら、
Single や Double ではなく、Integer や Decimal の方が良いでしょうね。
引用返信 編集キー/
■88783 / inTopicNo.4)  Re[3]: 大きな数値のcsvファイルへの書き込み
□投稿者/ なつ (19回)-(2018/09/26(Wed) 22:29:44)
shu さん
魔界の仮面弁士 さん
ありがとうございます。

Singleは正確性には欠けるようですね。

Excelも限界があるようです。
メモ帳では大丈夫なのですが、StringもLongもDecimalも、あと2桁増えるとEの表記にはなってもしまうのですが、
とりあえずは LongかDecimalでも事足りますのでこれを使うようにしたいと思います。
解決済み
引用返信 編集キー/
■88784 / inTopicNo.5)  Re[4]: 大きな数値のcsvファイルへの書き込み
□投稿者/ furu (185回)-(2018/09/27(Thu) 10:33:30)
No88783 (なつ さん) に返信
解決済みですが

> Excelも限界があるようです。
> メモ帳では大丈夫なのですが、StringもLongもDecimalも、あと2桁増えるとEの表記にはなってもしまうのですが、
Excelが見やすいように機能としてEの表記にしているだけで
内部のデータは桁落ちしていません。
セルの表示形式を「標準」から「数値」に変更すると表示できます。
解決済み
引用返信 編集キー/
■88786 / inTopicNo.6)  Re[5]: 大きな数値のcsvファイルへの書き込み
□投稿者/ 魔界の仮面弁士 (1864回)-(2018/09/27(Thu) 12:44:29)
No88784 (furu さん) に返信
> Excelが見やすいように機能としてEの表記にしているだけで
> 内部のデータは桁落ちしていません。

Excel も、やはり 15 桁程度で桁落ちします。たとえば、
12345678901234567890 と書いたとしても、
12345678901234500000 に丸められたりします。

※内部データが倍精度浮動小数点数(計算式では一部多倍長浮動小数点数)らしいです。


その他の数値型の有効桁数

16bit 整数型… 約 4.81647993062 桁 (Int16/UInt16)
32bit 整数型… 約 9.63295986125 桁 (Int32/UInt32)
64bit 整数型… 約 19.2659197225 桁 (Int64/UInt64)
Decimal 型…… 約 28.8988795837 桁 (96bit に相当)



*.csv をダブルクリックして Excel を関連付け起動するのではなく、
Excel の[データ]-[外部データ取り込み]-[テキストファイル]で読み取り、
ウィザード内で列のデータ形式を「G/標準」から「文字列」に変更しておくことで、
元のデータを維持して表示することができます。
(その代わり、数値として扱える有効桁数が変わるわけでは無いですが)


*.csv をダブルクリックしたときに、Excel で表示されることを優先するなら
 sr.WriteLine("=""12345678901234567890""")
のようにするという手もあります。
CSV データとして扱うには都合が悪くなるので、実用的では無いですが。
解決済み
引用返信 編集キー/
■88812 / inTopicNo.7)  Re[6]: 大きな数値のcsvファイルへの書き込み
□投稿者/ なつ (20回)-(2018/09/29(Sat) 20:32:23)
No88786 (魔界の仮面弁士 さん) に返信

色んなことあるのですね。
伺わないと分からぬことばかりです。
奥が深すぎて(汗;

解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ