2011-07-15 17 views
5

Nel mio programma mi sono imbattuto in un problema nel scrivere un numero piccolo in un contesto. Risposta che viene letta da una risposta jQuery ajax.Perché # # non funziona con numeri molto piccoli?

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

rendimenti [object XMLDocument]

Tuttavia,

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

restituisce 0.00 come previsto.

L'utilizzo di "n" è perfetto per il mio programma, ma perché "#. #" È tornato con un XMLDocument?

+2

Qual è il tipo di valore? –

+0

Si sta mescolando una variabile denominata "risultato" con una variabile denominata "valore". Chiaramente * risultato * è un numero, * valore * non lo è. –

+0

Scusa, l'ho risolto. Il valore è un doppio. – MikeKusold

risposta

4

visualizza un nome di tipo probabilmente perché ToString() restituisce qualcosa null, quindi ha invece per visualizzare qualcos'altro. Si vede un comportamento simile nel pannello di gente del posto di Visual Studio:

  1. Avviare un nuovo progetto applicazione console e sostituire la classe 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. Impostare un punto di interruzione alla parentesi di chiusura (}) di Main() e eseguire il progetto.

  3. Ora guarda il pannello locale. Visual Studio tenta di chiamare ToString() sugli oggetti per cosa visualizzare tra parentesi nella colonna Valore su questo pannello. Tuttavia, poiché un caso ritorna null, v'è evidentemente un ripiego di ottenere il nome del tipo:

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

Immagino context.Response.Write() sta facendo qualcosa di simile. Internamente utilizza un TextWriter, ed ecco alcuni dei processi che accade nella vostra problema "#.#":

  1. value.ToString("#.#"), a differenza value.ToString("#.0"), restituisce una stringa vuota ("") perché non ci sono i non-zero cifre per riempire il formato modello (questo è meglio che restituire ".").

  2. Il Write(string) metodo per le chiamate TextWriterToCharArray(), passaggio che a Write(char[]), che naturalmente scrive nulla.

La risposta produce sempre un XMLDocument al lato client, dal momento che XML è come AJAX trasporta richieste e le risposte - anche il corretto "0.00" viene trasportato in XML.Da qualche parte tra questo e il tuo ricevimento jQuery della risposta, qualcosa ha deciso di sostituire XMLDocument vuoto quando viene elaborato. Potrebbe essere lo stesso jQuery a farlo, ma non conosco la pipeline ASP.NET o jQuery abbastanza da trovare dove.

Quindi, evidentemente, le risposte AJAX vuote non sono così grandi.

0

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

Per default, il valore restituito contiene solo 15 cifre di precisione anche se viene mantenuto un massimo di 17 cifre internamente. Se il valore di questa istanza ha più di 15 cifre, ToString restituisce PositiveInfinitySymbol o NegativeInfinitySymbol anziché il numero previsto.

+1

Potrebbe essere quello che sta succedendo, ma la documentazione è formulata in modo orribile. –

+0

Quindi perché .ToString (n) funziona ma non .ToString (#. #)? Se è preciso, allora non dovrebbero fallire entrambi? – MikeKusold

+1

Per MSDN: "Si noti che questo identificatore non visualizza mai uno zero che non è una cifra significativa, * anche se zero è l'unica cifra nella stringa *. Visualizzerà zero solo se è una cifra significativa nel numero che si sta visualizzato." – user7116

Problemi correlati