2011-07-15 10 views
5

私のプログラムでは、context.Responseに小さな数字を書く問題に遭遇しました。これは、jQueryのajaxレスポンスによって読み取られています。なぜ、#。#は非常に小さい数字では機能しませんか?

value = -0.00000015928321772662457; 
context.Response.Write(value.ToString("#.#")); 

戻り

しかし[object XMLDocument]

context.Response.Write(value.ToString("n")); 

戻る予想通り0.00。

私のプログラムでは "n"を使っても問題ありませんが、なぜ "#。#"はXMLDocumentで返されましたか?デフォルトで

+2

値の種類は何ですか? –

+0

"result"という名前の変数と "value"という名前の変数を混在させています。明らかに*結果*は数値であり、*値*は数値ではありません。 –

+0

申し訳ありませんが、私はそれを修正しました。値は倍です。 – MikeKusold

答えて

4

何かがToString()戻りnullだから、それは代わりに何かを表示するために持っているので、それは、おそらくタイプ名が表示されます。

  1. 新しいコンソールアプリケーションプロジェクトを開始し、Programクラスに置き換えます:

    class Program { 
         static void Main() { 
          var a = new Program("asdf"); 
          var b = new Program(""); 
          var c = new Program(null); 
         } // <-- breakpoint here 
    
         string _data; 
         public Program(string data) { 
          _data = data; 
         } 
    
         public override string ToString() { 
          return _data; 
         } 
        } 
    
  2. Main()の閉じ中括弧(})にブレークポイントを設定すると、あなたは、Visual Studioの[ローカル]パネルで同様の動作を確認しますプロジェクトを実行します。

  3. ここで、ローカルパネルを見てください。 Visual Studioは、このパネルの[値]列の中括弧の間に何を表示するかについてオブジェクトのToString()を呼び出そうとします。

    a  {asdf} 
    b  {} 
    c  {ConsoleApplication1.Program} 
    

私はcontext.Response.Write()が同様の何かをやっている図:1つのインスタンスがnullを返すためしかし、型名を取得するフォールバックが明らかに存在しています。内部的にはTextWriterを使用しており、ここにあなたの"#.#"問題で起こるプロセスの一部です:

  1. value.ToString("#.#")、フォーマットを埋めるために何の非ゼロの数字がないのでvalue.ToString("#.0")とは異なり、空の文字列("")を返しますテンプレート(これは"."を返すよりも優れています)。

  2. もちろん何も書き込まれていないWrite(char[])の上でそれを渡すTextWriter通話ToCharArray()Write(string)方法、。 XMLは、AJAXの要求と応答を転送する方法であるため、

応答は常に、クライアント側にXMLDocumentを生成 - でも正しい"0.00"はXMLに搬送されます。応答とjQueryの受信の間のどこかで、処理時に空のXMLDocumentを置換する必要があります。 jQuery自体でさえ可能かもしれませんが、私はASP.NETパイプラインやjQueryがどこで見つかるかわかりません。

明らかに、空のAJAX応答はそれほど大きくありません。

0

http://msdn.microsoft.com/en-us/library/kfsatb94.aspx

17桁の最大値が内部に維持されているが、戻り値は、精度の15桁を含んでいます。このインスタンスの値が15桁を超える場合、ToStringは予想される数の代わりにPositiveInfinitySymbolまたはNegativeInfinitySymbolを返します。

+1

それは何が起こっているのかもしれないが、ドキュメンテーションは恐ろしい言葉になっている。 –

+0

なぜ、.ToString(n)は動作しますが、.ToString(#。#)は動作しませんか?それが精度であれば、両方失敗してはいけませんか? – MikeKusold

+1

MSDN: "この指定子は、0が文字列*内の唯一の数字であっても、有意な数字ではない0を表示しないことに注意してください。数字が有効数字の場合にのみ0を表示します表示されます。 – user7116

関連する問題