Double ToString - без научного обозначения

Я только что наткнулся на замечательную «особенность», заключающуюся в том, что .NET по умолчанию использует Double.ToString() научную нотацию, если имеется достаточно десятичных знаков.

.005.ToString() // ".005"
.00005.ToString() // "5E-05" 

Кто-нибудь знает эффективный способ заставить это появиться в виде строки в стандартной (ненаучной) нотации?

Я видел этот вопрос, но два верхних ответа кажутся добрыми для меня, поскольку они оба делают Double.ToString(), а затем просто переформатируют результаты.

Спасибо за любую помощь.

РЕДАКТИРОВАТЬ:

Желаемый результат:

.00005.ToString() == ".00005"

РЕДАКТИРОВАТЬ2:

Что со всеми повторяющимися и закрытыми голосами? Я специально говорю в вопросе, что на аналогичный вопрос нет удовлетворительного ответа. Люди на этом сайте слишком довольны властью.

МОЕ РЕШЕНИЕ:

Если это кому-то пригодится:

/// <summary>
/// Converts the double to a standard notation string.
/// </summary>
/// <param name="d">The double to convert.</param>
/// <returns>The double as a standard notation string.</returns>
public static String ToStandardNotationString(this double d)
{
    //Keeps precision of double up to is maximum
    return d.ToString(".#####################################################################################################################################################################################################################################################################################################################################");

}

ПРИМЕЧАНИЕ. Это работает только для значений> 1. Я еще не нашел эффективного способа сделать это для всех значений.


person MgSam    schedule 19.02.2013    source источник
comment
Вы понимаете, что в самом сердце компьютера числа с плавающей запятой хранятся в научной системе счисления с основанием 2. Это не саркастическая особенность; поведение является неотъемлемой частью типа. Хотя можно отображать числа с плавающей запятой в чисто десятичном формате (я поддерживаю ответ Тима С. по этому поводу), число вроде 2.68E201 будет просто иметь много нулей.   -  person KeithS    schedule 19.02.2013
comment
@KeithS ToString () должен иметь согласованное поведение независимо от оборудования. В этом весь смысл абстракций, на которых основано все современное программирование. Можно было бы ожидать, что для того, чтобы получить что-то в научной нотации, нужно уточнить это.   -  person MgSam    schedule 19.02.2013
comment
Я больше не могу отвечать, но вы можете преобразовать double в decimal, а затем сделать ToString(). Я не проводил тестирование производительности, которое быстрее, decimal или строка формата более 300 символов.   -  person ygoe    schedule 24.03.2016


Ответы (1)


См. Standard и Строки настраиваемого числового формата. Я думаю, вы ищете ".################":

.00005.ToString(".################") // returns ".00005"

Да, это несколько хакерски, но работает, если после десятичной дроби не больше такого количества знаков. Если вы это сделаете, вы можете использовать StringBuilder, чтобы построить около 330 # в вашей строке (double.Epsilon находится в порядке E-324).

person Tim S.    schedule 19.02.2013
comment
Я боялся, что это может быть единственный разумный способ. Однако более эффективно сделать строку длиной 324. ### константой, а не вычислять ее во время выполнения. - person MgSam; 19.02.2013
comment
@MgSam Более эффективный, конечно ... но если вы вычисляете его только один раз и сохраняете, эффективность незначительна. И ясность, полученная при генерации строки с помощью цикла, может того стоить ... вы могли точно увидеть, какой длины была строка, и иметь комментарий относительно того, почему ... и легко настроить ее, если вы когда-нибудь измените с двойного на поплавок и т.д. - person Beska; 19.02.2013
comment
@Beska Использование цикла было бы бессмысленным, если бы вы могли делать var format = "." + new string('#', 324) - person Lukazoid; 19.02.2013
comment
@Lukazoid Как бы то ни было. Конечно. Моя точка зрения (которую я, вероятно, не ясно изложил) заключалась в том, что жесткое кодирование длинной строки в константу не могло сэкономить много времени на ее генерацию один раз при запуске программы ... и видение 324 в процессе генерации, например как из цикла или как в вашем примере, лучше, потому что станет очевидным, что строка имеет длину ровно 324 символа (что не было бы очевидным из длинной константы.) Я просто защищал НЕ делать то, что он в конечном итоге делал , потому что следующий программист, смотрящий на эту огромную строку, понятия не имеет, сколько там хешей и почему. - person Beska; 20.02.2013
comment
@Beska Таким образом, комментарий. Весь аргумент не жестко кодировать это глупо, ИМО. Должен ли Math.Pi каждый раз вычислять Пи, а не жестко его кодировать? В этом весь смысл констант + документация. - person MgSam; 20.02.2013
comment
Я просто комментировал идею о том, что это более эффективно. Конечно ... но (вероятно) незначительно. Кроме того, я не думаю, что это то же самое, что Math.Pi ... Pi сложно вычислить, это легко ... Math.Pi никогда не меняется, это, при внутреннем использовании, может. Но ваше мнение о хорошей документации, устраняющей большинство этих проблем, вероятно, является ключевым. Если это хорошо задокументировано / прокомментировано, ни одна из этих вещей не будет иметь большого значения, и следующий программист будет доволен всем. Но комментарий сейчас не объясняет, сколько хешей там и почему. Опять же, просто придирки. - person Beska; 20.02.2013
comment
(И да, я понимаю, что double не изменится, но, поскольку вы пишете это сейчас, понятно, что кто-то может захотеть изменить / оптимизировать / расширить его позже) - person Beska; 20.02.2013