misc.log

日常茶飯事とお仕事と

Single型をToStringしたら桁数が減ってしまった

訳あってSingle型の数値をToStringで文字列化し、あとでまたParseを使って戻す必要が出てきたのですが、テストのためにSingle.MaxValueをこの処理にかけたところ…

  • Single.MaxValue = 3.40282347E+38
  • Single.MaxValue.ToString = "3.402823E+38"

と、ToStringを掛けた時点で値の桁数が2桁減ってしまいました(Eの前の「47」が消えている)。まぁ、こんな細かい値を扱う仕組みを作っているわけではないので、実害はないのですが、できるだけ汎用的な物を作るという観点からはクリアしておきたいところ……と思って調べたのですが…。

Single.ToString メソッド (String) / .NET Framework 2.0
http://msdn.microsoft.com/ja-jp/library/f71z6k0c(v=VS.80).aspx


ここにこんな記載がありました。

既定では、戻り値の有効桁数は 7 桁ですが、内部的には最大 9 桁が保持されています。
このインスタンスの値が 7 桁よりも大きい場合、ToString は、予期される数値ではな
く PositiveInfinitySymbol または NegativeInfinitySymbol を返します。
より多くの有効桁数が必要な場合は、format を指定するときに書式指定として "G9" 
または "R" を使用します。"G9" 書式指定では、常に 9 桁の有効桁数が返されます。
"R" 書式指定では、数値が 7 桁で表現できる場合は 7 桁の有効桁数が返され、
最大有効桁数でなければ表現できない場合は 9 桁が返されます。


"G9"を指定すれば、内部で保持する9桁まで出力されると?でもイミディエイトウィンドウで試してみるとこうなるのですが……

?Single.MaxValue.ToString("G9")
{"Enum 値が有効な範囲を超えています。"}
    _HResult: -2146233086
    _message: "Enum 値が有効な範囲を超えています。"
    ActualValue: Nothing
    Data: {System.Collections.ListDictionaryInternal}
    HelpLink: Nothing
    HResult: -2146233086
    InnerException: Nothing
    IsTransient: False
    Message: "Enum 値が有効な範囲を超えています。"
    ParamName: Nothing
    Source: Nothing
    StackTrace: Nothing
    TargetSite: Nothing

どゆこと?……判明。イミディエイトウィンドウだとダメ。実際に動くコードの中ならOKでした。どゆこと!?