2015-10-22 14 views
5

Jak przekonwertować double na string za pomocą 6 cyfr i usunąć końcowe zera?C# double.ToString() maksymalna liczba cyfr i zer końcowych

chcę mieć:

2.123456123 -> "2.123456" 
0.0000012 -> "0.000001" (and not "1.2e-6") 
12.45 -> "12.45" (and not "12.450000") 
36 -> "36" (and not "36.000000") 

użyciu string.Format("{0:F6"}, value) wyjściowe spływu zer i string.Format("{0:G6"}, value) nie zmieści drugim przykładzie.

Czy można używać value.ToString("0.######)?

Czy istnieje równoważny sposób postępowania z string.Format()?

+1

Tak, można użyć 'value.ToString (" 0. ###### ")'. Będzie używał aktualnej kultury bieżącego wątku, na przykład przy podejmowaniu decyzji, który łańcuch (jak '.') użyje dla kropki dziesiętnej. Odpowiednikiem "string.Format" jest po prostu: 'string.Format (" Mój numer {0: 0. ######} wygląda dobrze. ", Wartość)' Jeśli chcesz niezależności kultury, spróbuj 'value. ToString ("0. ######", CultureInfo.InvariantCulture) 'odpowiednio' string.Format (CultureInfo.InvariantCulture, "Mój numer {0: 0. ######} wygląda dobrze.", Wartość) '. –

+1

['#'] (https://msdn.microsoft.com/en-us/library/0c899ak8.aspx#SpecifierD) jest wykonany specjalnie z tego powodu. – Sinatr

+0

Dzięki za szybkie odpowiedzi! –

Odpowiedz

6

To jest w porządku, aby użyć value.ToString("0.######"). Jednak należy wziąć pod uwagę inną rzecz: double nie jest liczbą dziesiętną (podstawa 10). Powinieneś nie polegać na dziesiętnej reprezentacji liczby jako cokolwiek sensownego - wiele normalnej dziesiętnej bazy 10 liczb wymaga nieskończonego dziesiętnego rozwinięcia w bazie 2.

Jeśli nie interesuje cię dziesiętna reprezentacja, to może być lepszym pomysłem jest użycie numeru decimal - jest to również numer zmiennoprzecinkowy, ale w bazie 10.

W obu przypadkach obejmuje to zaokrąglanie - może być lub nie być tym, co chcesz.

+0

W tym konkretnym przypadku z "podwójnym" precyzja zaczyna być problemem, gdy kwota (jego wartość bezwzględna) przekracza miliard. Na przykład '1000000000.654321' nie będzie miał pełnej precyzji po sformatowaniu na łańcuch w ten sposób (string przyjmuje postać' "1000000000.65432" '). –

+0

Dzięki za odpowiedź. Jest tak dlatego, że naturalne zaokrąglenie podwójnego jest niedokładne w ostatnich miejscach dziesiętnych, które musimy zaokrąglić w wartości przy zapisywaniu ich do pliku. Zauważyliśmy, że w zależności od używanej maszyny naturalne zaokrąglenie nie będzie takie samo (około 1e-14/1e-15 precyzji). –

Powiązane problemy