2012-10-19 7 views

Odpowiedz

5

Z Dokumenty do Double.ToString(IFormatProvider):

Ten przykład jest sformatowane w formacie ogólnym specyfikatora numerycznej ("G").

Od docs dla General Numeric Format Specifier:

stałym punktem notacja jest używana, jeśli wykładnik, które wynikają z wyrażający liczbę w notacji naukowej jest większa niż -5 i mniej niż precyzyjną specyfikacją; w innym przypadku stosuje się notację naukową. Wynik zawiera kropkę dziesiętną, jeśli jest wymagana, a kończące się zera po przecinku dziesiętnym są pomijane. Jeśli specyfikator precyzji jest obecny, a liczba cyfr znaczących w wyniku przekracza określoną precyzję, nadmiarowe cyfry są usuwane poprzez zaokrąglenie.

Jeśli jednak liczba jest liczbą dziesiętną, a specyfikator precyzji jest pomijany, notacja stałoprzecinkowa jest zawsze używana, a końcowe zera są zachowywane.

Domyślna precyzja specifier dla Double dokumentuje się 15.

Chociaż wcześniej w tabeli, to brzmi nieco inaczej:

Rezultat: Najbardziej kompaktowy z obu stałym punkcie lub notacja naukowa.

Nie wypracowaliśmy, czy te dwa są zawsze równoważne dla wartości Double ...

EDIT: Zgodnie z komentarzem Abla:

Ponadto, nie zawsze jest najbardziej zwarta notacja. 0,0001 jest większy niż 1E-04, ale pierwszy to wynik. Dokumenty MS nie są kompletne tutaj.

Oczywiście pasuje to do bardziej szczegółowego opisu. (Ponieważ wymagany wykładnik jest większy niż -5, a mniejszy niż 15.)

+0

Odpowiedź nie zawiera specyfikacji precyzji, która jest częścią tego, dlaczego jest pokazywana w taki sposób. Wartością domyślną jest '15'. Ponadto nie zawsze jest to najbardziej kompaktowy zapis. '0.0001' jest większe niż' 1E-04', ale pierwsze jest wyprowadzane. Dokumenty MS nie są kompletne tutaj. – Abel

+0

@Abel: Zawiera oba bity, dziękuję. –

+0

Nie zgadzam się z terminem "najbardziej kompaktowy" i uważam dokumentację msdn za wprowadzającą w błąd pod tym względem. Jeśli weźmiesz podwójne x = 13950, to format G4 generuje "1.395E + 04", który jest mil od "najbardziej kompaktowy". Moim zdaniem format "G" działał lepiej w C, Fortran itd., Gdzie naprawdę powstał "najbardziej zwarty" ciąg. C# zmusza mnie do szukania obejść ... –

1

Właśnie próbowałem z pętlą:

double a = 1; 
for (var i = 1; i < 10; i++) 
{ 
    a = a/10; 
    Console.WriteLine(a.ToString(CultureInfo.InvariantCulture)); 
} 

Wyjście było:

0.1 
0.01 
0.001 
0.0001 
1E-05 
1E-06 
1E-07 
1E-08 
1E-09 
+1

Próbowałem podobnych eksperymentów, ale nadal nie miałem dokładnej odpowiedzi na pytanie, dlaczego konwersja ma miejsce, gdy tak się dzieje. – geekchic

5

Z dokumentacji wynika, że ​​najbardziej kompaktowa forma do reprezentowania numer zostanie wybrany.

Np. Gdy nie zostanie podany ciąg formatu, default is the "G" format string. Od numeru specification of the G format string:

Wynik: najbardziej kompaktowa z notacji stałej lub naukowej.

Urządzenie default for the number of digits ma 15 znaków ze specyfikatorem. Oznacza to, że liczba reprezentowana jako dokładnie pewną binarną reprezentację (jak 0,1 w przykładzie harriyotta) będzie wyświetlana jako punkt stały, chyba że notacja wykładnicza jest bardziej zwarta.

Gdy jest więcej cyfr, domyślnie wyświetla wszystkie te cyfry (do 15) i wybiera notację wykładniczą, gdy jest ona krótsza.

Kładzenie to razem:

?(1.0/7.0).ToString() 
"0,142857142857143"  // 15 digits 
?(10000000000.0/7.0).ToString() 
"1428571428,57143"  // 15 significant digits, E-notation not shorter 
?(100000000000000000.0/7.0).ToString() 
"1,42857142857143E+16" // 15 sign. digits, above range for non-E-notation (15) 
?(0.001/7.0).ToString() 
"0,000142857142857143" // non E-notation is shorter 
?(0.0001/7.0).ToString() 
"1,42857142857143E-05" // E-notation shorter 

I, zainteresowania:

?(1.0/2.0).ToString() 
"0,5"     // exact representation 
?(1.0/5.0).ToString() 
"0,2"     // rounded, zeroes removed 
?(1.0/2.0).ToString("G20") 
"0,5"     // exact representation 
?(1.0/5.0).ToString("G20") 
"0,20000000000000001" // unrounded 

to, aby pokazać, co dzieje się za sceną i dlaczego 0.2 jest napisane jak 0.2, nie 0,20000000000000001, która jest faktycznie jest. Domyślnie wyświetlanych jest 15 cyfr znaczących. Kiedy jest więcej cyfr (i zawsze są, z wyjątkiem pewnych liczb specjalnych), są one zaokrąglane w zwykły sposób. Po zaokrągleniu zbędne zera są usuwane.

Należy zauważyć, że podwójny ma precyzję 15 lub 16 cyfr, w zależności od liczby. Tak więc, pokazując 15 cyfr, widzimy prawidłowo zaokrągloną liczbę i zawsze pełną reprezentację i najkrótszą reprezentację podwójnej.

4

Używa formatowania „G” (na „General”), który jest określony w użyciu „najbardziej kompaktowy z obu stałym punktem lub notacji naukowej” http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx

Więc od ustalonego punktu 0.00001 jest bardziej znaków niż 1E-05 będzie faworyzować notację naukową. Przypuszczam, że jeśli mają równą długość, to faworyzuje stały punkt.

+0

'0.0001' ma więcej znaków niż" 1E-04 ", ale jest preferowane ...;) – Abel

Powiązane problemy