Преобразование байтов к ГБ в C#?

Правовая оговорка: Этот ответ полностью non-programming-related. Это действительно, однако, пытается напасть на причину сценариев во-первых.

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

существует много других опций, и я уверен, что другие могут думать о некоторых различных:

  • очередь упорядочивания (система предзаказа) - Некоторые сценарии могли бы все еще закончиться впереди очереди, но это, вероятно, быстрее только к, вручную вводят информацию

  • система лотереи (все, кто пытается приказать, чтобы каждый был введен в систему) - Этот способ, без которого у людей со сценариями есть просто те же возможности как те.

  • приоритетная очередь порыва - Если существует действительно высокое воспринятое значение, люди могут быть готовы заплатить больше. Реализуйте очередь упорядочивания, но позвольте людям платить больше, чтобы быть помещенными выше в очереди.

  • аукцион (кредит переходит к David Schmitt для этого, комментарии, является моим собственным) - Люди могут все еще использовать сценарии для стрельбы из укрытия в в последнюю минуту, но мало того, что это изменяет структуру оценки, люди ожидают побеждать его с другими. Можно также сделать вещи ограничить количество предложений в данном периоде времени, заставить людей позвонить в загодя для кода авторизации, и т.д.

30
задан Michael Kniskern 12 August 2009 в 21:07
поделиться

7 ответов

Если точная точность не важна, используйте double:

double gb = kb / 1048576D

Согласитесь с Павлом здесь - на самом деле нет необходимости реорганизовывать этот код ... на самом деле, если это самая большая проблема в вашей кодовой базе, я думаю, вы могли бы сидеть на самом хорошо написанном программном обеспечении.

18
ответ дан 27 November 2019 в 22:57
поделиться

Исходный код краткий, легко читаемый, с разумными именами переменных, самодокументирующийся; Я бы не стал его менять.

Если вам абсолютно необходимо провести рефакторинг, вы можете создать набор методов расширения для числовых типов:

public static double BytesToKilobytes(this Int32 bytes)
{
    return bytes / 1024d;
}
public static double BytesToMegabytes(this Int32 bytes)
{
    return bytes / 1024d / 1024d;
}
public static double KilobytesToBytes(this double kilobytes)
{
    return kilobytes * 1024d;
}

//You can then do something like:
double filesize = 32.5d;
double bytes = filesize.KilobytesToBytes();

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

8
ответ дан 27 November 2019 в 22:57
поделиться

Лично я бы написал это так: десятичный ГБ = КБ / (1024 * 1024); , но на самом деле нет необходимости реорганизовывать написанный код.

2
ответ дан 27 November 2019 в 22:57
поделиться

Что ж, формула неверна (в гигабайте всего около миллиона килобайт, а не тысяча миллионов), но в остальном все в порядке. Любой, кто привык работать с этими числами, знает, что они означают.

Одна вещь, на которую я хотел бы обратить внимание (и я не знаю, является ли это проблемой для C #), - это то, что компилятор не сможет оптимизировать x / 1024/1024 , если x не является базовым типом. С помощью C и целых чисел компилятор довольно легко превратит это в инструкцию «ослепительно-быстрый сдвиг вправо на 20 бит».

Если decimal является классом, а не базовым типом, компилятору, возможно, придется сделать две операции деления. Оказывает ли это какое-либо реальное влияние на скорость (или даже происходит ли это вообще), находится за пределами моей области знаний.

Одно я ' Я бы подумал об изменении фактических имен переменных. Это не имеет никакого значения для скомпилированного кода, но я предпочитаю более длинные имена переменных, а не сокращения, поэтому я бы выбрал kiloBytes / gigaBytes или что-то в этом роде. КБ / ГБ слишком легко спутать с константами, в зависимости от ваших стандартов кодирования.

2
ответ дан 27 November 2019 в 22:57
поделиться

Чтобы убедиться, что компилятор предварительно вычисляет делители:

decimal GB = KB / (1024 * 1024);

Обратите внимание, что вы фактически вычисляете ГиБ (гибибайт), а не ГБ (гигабайт). Если вы действительно хотите рассчитать ГБ, это будет:

decimal GB = KB / (1000 * 1000);
1
ответ дан 27 November 2019 в 22:57
поделиться

Теоретически это быстрее (предварительное вычисление константы для умножения вместо деления). Вероятно, он используется не так часто, чтобы иметь значение, но на всякий случай.

double const KbToGbFactor = 1d / 1024 /1024;

double gb = kb * KbToGbFactor;
2
ответ дан 27 November 2019 в 22:57
поделиться

Я разработал этот метод здесь, работает до ТБ.

private static string FormatBytes(long bytes)
{
    string[] Suffix = { "B", "KB", "MB", "GB", "TB" };
    int i;
    double dblSByte = bytes;
    for (i = 0; i < Suffix.Length && bytes >= 1024; i++, bytes /= 1024) 
    {
        dblSByte = bytes / 1024.0;
    }

    return String.Format("{0:0.##} {1}", dblSByte, Suffix[i]);
}
91
ответ дан 27 November 2019 в 22:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: