2011-07-15 21 views
5

W moim programie napotkałem problem zapisując małą liczbę do kontekstu. Odpowiedź, która jest następnie odczytywana przez odpowiedź ajax jQuery.Dlaczego liczba # nie działa dla bardzo małych liczb?

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

powraca [object XMLDocument]

jednak

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

zwraca 0.00 zgodnie z oczekiwaniami.

Używanie "n" jest całkowicie w porządku dla mojego programu, ale dlaczego "#. #" Powraca z dokumentem XMLDocument?

+2

Jaki jest typ wartości? –

+0

Miksujesz zmienną o nazwie "wynik" ze zmienną o nazwie "wartość". Oczywiście * wynik * to liczba, * wartość * nie jest. –

+0

Przepraszam, naprawiłem to. Wartość jest podwójna. – MikeKusold

Odpowiedz

4

Wyświetla nazwę typu prawdopodobnie dlatego, że coś jest ToString() powraca null, więc zamiast tego ma się wyświetlić coś innego. Widzisz podobne zachowanie w Visual Studio w panelu mieszkańcy:

  1. rozpocząć nowy projekt aplikacji konsoli i zastąpić klasę 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. ustawić punkt przerwania w nawias zamykający (}) z Main() i uruchomić projekt.

  3. Teraz spójrz na panel Locals. Visual Studio próbuje wywołać ToString() na obiektach, które mają być wyświetlane między nawiasami klamrowymi w kolumnie Wartość na tym panelu. Jednakże, ponieważ jedna instancja zwraca null, jest ewidentnie awaryjna uzyskiwania nazwy typu:

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

I postać context.Response.Write() robi coś podobnego. Wewnętrznie używa TextWriter, a oto niektóre z procesu, co dzieje się w Twojej "#.#" wydania:

  1. value.ToString("#.#"), w przeciwieństwie value.ToString("#.0"), zwraca pusty ciąg (""), ponieważ nie istnieją niezerowe cyfry, aby wypełnić format szablon (to jest lepsze niż zwracanie ".").

  2. Write(string) Sposób TextWriter połączeń ToCharArray(), że przechodząc na Write(char[]), co oczywiście nic nie pisze.

Odpowiedź zawsze wywołuje XMLDocument na stronie klienta, gdyż XML jest jak AJAX transportuje żądania i odpowiedzi - nawet poprawne "0.00" jest transportowane w formacie XML.Gdzieś pomiędzy tym a twoim odzewem jQuery odpowiedzi, coś zadecydowało, że pusty XMLDocument powinien zostać zastąpiony podczas przetwarzania. Nawet może to być samo jQuery, ale nie znam potoku ASP.NET lub jQuery, aby znaleźć miejsce.

Najwyraźniej puste odpowiedzi AJAX nie są tak wspaniałe.

0

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

Domyślnie wartość zwracana zawiera tylko 15 cyfr precyzji chociaż maksymalnie 17 cyfr jest utrzymywana wewnętrznie. Jeśli wartość tej instancji ma więcej niż 15 cyfr, ToString zwraca wartość PositiveInfinitySymbol lub NegativeInfinitySymbol zamiast oczekiwanej liczby.

+1

To może być to, co się dzieje, ale dokumentacja jest okropnie sformułowana. –

+0

Dlaczego więc .ToString (n) działa, ale nie .ToString (#. #)? Jeśli jest to precyzja, to czy obydwa powinny zawodzić? – MikeKusold

+1

Na MSDN: "Zauważ, że ta specyfikacja nigdy nie wyświetla zera, które nie jest cyfrą znaczącą, * nawet jeśli zero jest jedyną cyfrą ciągu *. Wyświetli zero tylko wtedy, gdy jest znaczącą cyfrą w liczbie, która jest wystawiany." – user7116

Powiązane problemy