Как получить значение с плавающей запятой без включения экспоненциальной записи

Можно ли в C# выполнить ToString для числа с плавающей запятой и получить значение без использования экспонент?

Например, рассмотрим следующее:

float dummy;

dummy = 0.000006F;

Console.WriteLine(dummy.ToString());

Это дает результат

6E-06

Однако то, чем я был,

0.000006

Самое близкое, что я смог найти, это использование квалификатора «F», однако затем мне нужно указать количество знаков после запятой, иначе значение будет округлено.

Есть ли на самом деле способ сделать это автоматически, или мне нужно выполнить кучу забавной логики, чтобы либо обрезать нули, либо вычислить количество требуемых десятичных знаков.

Спасибо;
Ричард Мосс


person Richard Moss    schedule 21.09.2010    source источник


Ответы (4)


Попробуй это

Console.WriteLine(dummy.ToString("F"));

Вы также можете указать количество знаков после запятой. Например F5, F3 и т.д.

Кроме того, вы можете проверить спецификатор пользовательского формата

Console.WriteLine(dummy.ToString("0.#########"));
person default locale    schedule 21.09.2010
comment
Да, как уже упоминалось, я уже пробовал это. Однако мне нужно указать количество знаков после запятой, которое я не обязательно буду знать (если только я не упустил что-то еще;)) - я несколько удивлен, что я не могу сделать это, кроме как с нотацией E чего не хотят мои пользователи. - person Richard Moss; 21.09.2010
comment
Ой, извините, мне пришлось читать внимательнее. Итак, если вы хотите отобразить число с плавающей запятой, вы должны объявить максимальную десятичную точность для отображения. Кстати, тип float не обеспечивает высокой точности (~10^(-39)) и можно просто выбрать достаточно большое количество знаков после запятой. - person default locale; 21.09.2010
comment
Я также пробовал это, то есть F10, но побочным эффектом было то, что нули продолжались после 6. Я надеялся избежать этого, но если это будет единственный способ избавиться от лишних нулей, я полагаю. Это только кажется таким... неуклюжим! - person Richard Moss; 21.09.2010
comment
Возможно, вам поможет пользовательский формат. Попробуйте это: Console.WriteLine(dummy.ToString(0.#########)); он напечатает максимум 9 знаков после запятой и обрежет конечные нули - person default locale; 21.09.2010
comment
Кстати, десятичный тип .Net предпочтительнее для десятичных вычислений - person default locale; 21.09.2010
comment
@Richard, вы рассматривали возможность использования десятичного типа вместо этого? Похоже, это может быть лучше подходит для того, что вы хотите. - person Winston Smith; 21.09.2010
comment
Хотя, как вы говорите, может иметь смысл использовать десятичный тип, к сожалению, это было бы серьезным изменением, и я не могу сделать это в краткосрочной перспективе. - person Richard Moss; 21.09.2010

Без дополнительной справочной информации трудно сказать, но похоже, что вам нужна десятичная семантика. Так почему бы не использовать вместо этого тип decimal?

decimal dummy;
dummy = 0.000006M;

Десятичный тип более точен для представления десятичных чисел, чем float или double, но не так эффективен. См. здесь. больше информации.

person Winston Smith    schedule 21.09.2010

Console.WriteLine(dummy.ToString("N5"));

где 5 его количество знаков после запятой

person Sebastian Brózda    schedule 21.09.2010
comment
Спасибо за ответ, это тоже то, что я уже пробовал, и у меня та же проблема, что и у квалификатора F, поскольку мне нужно явно указать точность, которую я не знаю. - person Richard Moss; 21.09.2010

float dummy = 0.000006F;
Console.WriteLine(dummy.ToString("0." + new string('#', 60)));

Если вы будете делать это часто, то имеет смысл хранить строку формата где-то в поле/свойстве static и использовать ее повторно, а не создавать каждый раз новый string:

private static readonly string _allFloatDigits = "0." + new string('#', 60);

// ...

float dummy = 0.000006F;
Console.WriteLine(dummy.ToString(_allFloatDigits));
person LukeH    schedule 21.09.2010