Равномерно разделите сумму в долларах (десятичное число) на целое число

Я должен записать бухгалтерскую стандартную программу для программы, которую я создаю, который даст мне ровное подразделение десятичного числа целым числом. Так, чтобы, например:

$143.13 / 5 =

28.62
28.62
28.63
28.63
28.63

Я видел статью здесь: Равномерно разделитесь на c#, но на него кажется, что только работает на целочисленные подразделения. Какая-либо идея изящного решения этой проблемы?

16
задан Community 23 May 2017 в 12:10
поделиться

7 ответов

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

decimal total = 143.13m;
int divider = 5;
while (divider > 0) {
  decimal amount = Math.Round(total / divider, 2);
  Console.WriteLine(amount);
  total -= amount;
  divider--;
}

Результат:

28,63
28,62
28,63
28,62
28,63
33
ответ дан 30 November 2019 в 15:08
поделиться

Прежде всего, убедитесь, что вы не используете номер с плавающей запятой, чтобы представлять доллары и центы (см. Другие сообщения для того, почему, но простая причина в том, что не все десятичные числа могут быть представлены как поплавки, например, $ 1.79) Отказ

Вот один из способов сделать это:

decimal total = 143.13m;
int numberOfEntries = 5;
decimal unadjustedEntryAmount = total / numberOfEntries;
decimal leftoverAmount = total - (unadjustedEntryAmount * numberOfEntries);
int numberOfPenniesToDistribute = leftoverAmount * 100;
int numberOfUnadjustedEntries = numberOfEntries - numberOfPenniesToDistribute;

Так что теперь у вас есть нескорректированные суммы 28,62, а затем вы должны решить, как распространять остаток. Вы можете либо распространять дополнительную пенни к каждому, начиная с вершины или внизу (выглядит как вы хотите снизу).

for (int i = 0; i < numberOfUnadjustedEntries; i++) {
  Console.WriteLine(unadjustedEntryAmount);
}

for (int i = 0; i < numberOfPenniesToDistribute; i++) {
  Console.WriteLine(unadjustedEntryAmount + 0.01m);
}

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

3
ответ дан 30 November 2019 в 15:08
поделиться

Вы можете использовать алгоритм в вопросе, который вы ссылаетесь на умножение на 100, используя целое число равномерно разделите функцию, а затем разделить каждый из результатов на 100 (предполагая, что вы только хотите обрабатывать только 2 дп, если вы хотите 3DP несколько на 1000 и т. Д.)

1
ответ дан 30 November 2019 в 15:08
поделиться

. Проще иметь дело с центами. Я бы предположил, что вместо 143.13 вы разделите 14313 на 5 равных частей. Что дает вам 2862 и остаток 3. Вы можете назначить эту оставшуюся часть к первым трем частям или любым способам. Наконец, преобразуйте центы обратно в доллары.

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

3
ответ дан 30 November 2019 в 15:08
поделиться

Также можно использовать генерацию C # итератора, чтобы сделать Ответ Гуффы Удобнее:

public static IEnumerable<decimal> Divide(decimal amount, int numBuckets)
{
    while(numBuckets > 0)
    {
        // determine the next amount to return...
        var partialAmount = Math.Round(amount / numBuckets, 2);
        yield return partialAmount;
        // reduce th remaining amount and #buckets
        // to account for previously yielded values
        amount -= partialAmount;
        numBuckets--;
    }
}
1
ответ дан 30 November 2019 в 15:08
поделиться

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

decimal total = 143.13m;
int divider = 5;
while (divider > 0) {
  decimal amount = Math.Round(total / divider, 2);
  Console.WriteLine(amount);
  total -= amount;
  divider--;
}

Результат:

28,63
28,62
28,63
28,62
28,63
-121--1698388-

Вы можете решить это (в центах) без построения массива:

int a = 100 * amount;
int low_value = a / n;
int high_value = low_value + 1;
int num_highs = a % n;
int num_lows = n - num_highs;
30
ответ дан 30 November 2019 в 15:08
поделиться

Если у вас есть поплавок, который гарантируется ровно две цифры точности, как насчет этого (псевдокод):

amount = amount * 100 (convert to cents)
int[] amounts = new int[divisor]
for (i = 0; i < divisor; i++) amounts[i] = amount / divisor
extra = amount % divisor
for (i = 0; i < extra; i++) amounts[i]++

, а затем делать то, что вы хотите с суммами , которые находятся в центах - вы могли преобразовать Вернуться к плаванию, если вы абсолютно приходили, или формат как доллары и центы.

Если не понятно, точка всего этого - не просто разделить ценность поплавка равномерно, но разделить денежную сумму как можно равномерно, учитывая, что центы являются неделимой единицей USD. В ОП: дайте мне знать, если это не то, что вы хотели.

2
ответ дан 30 November 2019 в 15:08
поделиться
Другие вопросы по тегам:

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