2010-01-20 9 views
16

Jak zapobiec zaokrąglaniu podwójnej wartości podczas konwersji na ciąg? Próbowałem zarówno Convert.ToString i ToString() z tym samym wynikiem.Dlaczego ToString() zaokrągla moją podwójną wartość?

Na przykład moje podwójne może wyglądać jak 77.987654321, a konwersje dwóch ciągów konwertować na 77.98765. Muszę zachować dokładność wartości, jaka jest.

+1

Dla mnie ToString() zachowuje dokładność. Jakiś kod byłby miły. –

+0

Zobacz również http://stackoverflow.com/questions/1421520/formatting-doubles-for-output-in-c –

Odpowiedz

23

Domyślnie metoda .ToString() z Double zwraca 15 cyfr precyzji. Jeśli chcesz mieć pełne 17 cyfr, które podwójna wartość zawiera wewnętrznie, musisz przekazać metodę specyfikacji "G17".

String s = value.ToString("G17"); 

pochodzić z MSDN docs:

Domyślnie wartość zwracana tylko zawiera 15 cyfr precyzji chociaż maksymalnie 17 cyfr jest utrzymywana wewnętrznie. Jeśli wartość tej instancji ma więcej niż 15 cyfr, ToString zwraca PositiveInfinitySymbol lub NegativeInfinitySymbol zamiast oczekiwanej liczby . Jeśli potrzebujesz więcej precyzji określenia formatu z „G17” specyfikacji formatu , który zawsze zwraca 17 cyfr precyzji lub „R”, która zwraca 15 cyfr, jeżeli liczba można przedstawić z tego precyzji lub 17 Cyfry, jeśli numer może być reprezentowany tylko z maksymalną precyzją .

+0

Zastanawiają się, dlaczego nie zwracają automatycznie wszystkich 17 cyfr i pozwalają użytkownikom je zaokrąglać, jeśli chcą. –

+0

@Robert: Wiem co masz na myśli. To dziwne, że tęsknią za nimi. Gdyby to były setki, zrozumiałbym, ale ze względu na 2 cyfry wydaje się to dziwne. –

+0

Należy zauważyć, że jest napisane "a * maximum * of 17 digits". Dwa ostatnie mogą być prawdopodobnie niedokładne, co wydaje się uzasadnionym powodem do ich domyślnego opuszczenia. – Thomas

5

Klasa Jona Skeeta DoubleConverter ma metodę ToExactString(), która zwraca dokładną wartość podwójnego jako ciąg.

http://www.yoda.arachsys.com/csharp/DoubleConverter.cs

+0

jakichkolwiek informacji o licencji na ten kod? –

+0

Powinieneś zapytać Jona, ale najprawdopodobniej "użyj go, jak chcesz". Większość projektów GitHub Jona to Apache lub BSD. –

13

Spróbuj czegoś podobnego

myDouble.ToString("R") 

Zobacz również The Round-trip ("R") Format Specifier:

okrągłego-podróży ("R") gwarantuje Format specifier że wartość liczbowa, która przekształca się w ciąg zostanie sparsowany z powrotem do tej samej wartości liczbowej.

0

Brak gwarancji, ale spróbuj ToString ("R").

2

Przypuszczam, że głównym odpowiedź do zaokrąglania dala dwie ostatnie cyfry, jest ukrycie niestabilności numerycznej/zaokrąglenia powodu pływaka/podwójne skończoną precyzję.

Przykład bez zaokrąglania:

(Math.Sqrt(7)).ToString("G17") = "2.6457513110645907" 

(Math.Sqrt(7)+6).ToString("G17") = "8.6457513110645898" 

wygląda nieco dziwnie w ciągu ostatnich 3 cyfr, prawda?

Przykład z zaokrągleniami:

(Math.Sqrt(7)).ToString() = "2.64575131106459" 

(Math.Sqrt(7)+6).ToString() = "8.64575131106459" 

Look "doskonały", prawda?

:-)

Powiązane problemy