#c# #decimal #rounding
#c# #десятичная #округление
Вопрос:
Мой код работает хорошо, пока я не доберусь до программы, и мои выходные данные теперь попадают в приемлемые пределы.
Я добавляю так:
using System;
namespace ITSS131
{
public class Program
{
public static void Main(string[] args)
{
Console.WriteLine("hello what is your car loan amount.");
decimal loan = decimal.Parse(Console.ReadLine());
Console.WriteLine("What is your APR");
decimal APR = decimal.Parse(Console.ReadLine());
Console.WriteLine("What is the monthly payment");
int monthlypayment = int.Parse(Console.ReadLine());
int currentmonth = 0;
int u = 0;
int c = 1;
while (loan >= 0.00m)
{
decimal.Round(APR);
decimal TAX = APR / 12.00m / 100.00m;
decimal.Round(TAX);
decimal TAX2 = TAX * loan;
decimal Tax3 = monthlypayment - TAX2;
decimal.Round(loan = loan TAX2 - monthlypayment);
currentmonth ;
Console.WriteLine($"Month - Interst - Principle - Balance");
Console.WriteLine($"{currentmonth} {TAX2.ToString("C")} {Tax3.ToString("C")} {loan.ToString("C")}");
}
}
}
}
Предполагается, что результат должен быть
1 $78.75 $271.25 $20,728.75
2 $77.73 $272.27 $20,456.48
3 $76.71 $273.29 $20,183.19
4 $75.69 $274.31 $19,908.88
5 $74.66 $275.34 $19,633.54
6 $73.63 $276.37 $19,357.17
7 $72.59 $277.41 $19,079.76
8 $71.55 $278.45 $18,801.31
9 $70.50 $279.50 $18,521.81
10 $69.46 $280.54 $18,241.27
11 $68.40 $281.60 $17,959.67
12 $67.35 $282.65 $17,677.02
13 $66.29 $283.71 $17,393.31
14 $65.22 $284.78 $17,108.53
15 $64.16 $285.84 $16,822.69
16 $63.09 $286.91 $16,535.78
17 $62.01 $287.99 $16,247.79
18 $60.93 $289.07 $15,958.72
19 $59.85 $290.15 $15,668.57
20 $58.76 $291.24 $15,377.33
21 $57.66 $292.34 $15,084.99
22 $56.57 $293.43 $14,791.56
23 $55.47 $294.53 $14,497.03
24 $54.36 $295.64 $14,201.39
25 $53.26 $296.74 $13,904.65
26 $52.14 $297.86 $13,606.79
27 $51.03 $298.97 $13,307.82
28 $49.90 $300.10 $13,007.72
29 $48.78 $301.22 $12,706.50
30 $47.65 $302.35 $12,404.15
31 $46.52 $303.48 $12,100.67
32 $45.38 $304.62 $11,796.05
33 $44.24 $305.76 $11,490.29
34 $43.09 $306.91 $11,183.38
35 $41.94 $308.06 $10,875.32
36 $40.78 $309.22 $10,566.10
37 $39.62 $310.38 $10,255.72
38 $38.46 $311.54 $9,944.18
39 $37.29 $312.71 $9,631.47
40 $36.12 $313.88 $9,317.59
41 $34.94 $315.06 $9,002.53
42 $33.76 $316.24 $8,686.29
43 $32.57 $317.43 $8,368.86
44 $31.38 $318.62 $8,050.24
45 $30.19 $319.81 $7,730.43
46 $28.99 $321.01 $7,409.42
47 $27.79 $322.21 $7,087.21
48 $26.58 $323.42 $6,763.79
49 $25.36 $324.64 $6,439.15
50 $24.15 $325.85 $6,113.30
51 $22.92 $327.08 $5,786.22
52 $21.70 $328.30 $5,457.92
53 $20.47 $329.53 $5,128.39
54 $19.23 $330.77 $4,797.62
55 $17.99 $332.01 $4,465.61
56 $16.75 $333.25 $4,132.36
57 $15.50 $334.50 $3,797.86
58 $14.24 $335.76 $3,462.10
59 $12.98 $337.02 $3,125.08
60 $11.72 $338.28 $2,786.80
61 $10.45 $339.55 $2,447.25
62 $9.18 $340.82 $2,106.43
63 $7.90 $342.10 $1,764.33
64 $6.62 $343.38 $1,420.95
65 $5.33 $344.67 $1,076.28
66 $4.04 $345.96 $730.32
67 $2.74 $347.26 $383.06
68 $1.44 $348.56 $34.50
68 $0.13 $34.50 $0.00
но вместо этого я получаю
Month - Interst - Principle - Balance
1 $78.75 $271.25 $20,728.75
Month - Interst - Principle - Balance
2 $77.73 $272.27 $20,456.48
Month - Interst - Principle - Balance
3 $76.71 $273.29 $20,183.19
Month - Interst - Principle - Balance
4 $75.69 $274.31 $19,908.88
Month - Interst - Principle - Balance
5 $74.66 $275.34 $19,633.54
Month - Interst - Principle - Balance
6 $73.63 $276.37 $19,357.17
Month - Interst - Principle - Balance
7 $72.59 $277.41 $19,079.76
Month - Interst - Principle - Balance
8 $71.55 $278.45 $18,801.30
Month - Interst - Principle - Balance
9 $70.50 $279.50 $18,521.81
Month - Interst - Principle - Balance
10 $69.46 $280.54 $18,241.27
Month - Interst - Principle - Balance
11 $68.40 $281.60 $17,959.67
Month - Interst - Principle - Balance
12 $67.35 $282.65 $17,677.02
Month - Interst - Principle - Balance
13 $66.29 $283.71 $17,393.31
Month - Interst - Principle - Balance
14 $65.22 $284.78 $17,108.53
Month - Interst - Principle - Balance
15 $64.16 $285.84 $16,822.69
Month - Interst - Principle - Balance
16 $63.09 $286.91 $16,535.78
Month - Interst - Principle - Balance
17 $62.01 $287.99 $16,247.78
Month - Interst - Principle - Balance
18 $60.93 $289.07 $15,958.71
Month - Interst - Principle - Balance
19 $59.85 $290.15 $15,668.56
Month - Interst - Principle - Balance
20 $58.76 $291.24 $15,377.32
Month - Interst - Principle - Balance
21 $57.66 $292.34 $15,084.98
Month - Interst - Principle - Balance
22 $56.57 $293.43 $14,791.55
Month - Interst - Principle - Balance
23 $55.47 $294.53 $14,497.02
Month - Interst - Principle - Balance
24 $54.36 $295.64 $14,201.38
Month - Interst - Principle - Balance
25 $53.26 $296.74 $13,904.64
Month - Interst - Principle - Balance
26 $52.14 $297.86 $13,606.78
Month - Interst - Principle - Balance
27 $51.03 $298.97 $13,307.80
Month - Interst - Principle - Balance
28 $49.90 $300.10 $13,007.71
Month - Interst - Principle - Balance
29 $48.78 $301.22 $12,706.49
Month - Interst - Principle - Balance
30 $47.65 $302.35 $12,404.14
Month - Interst - Principle - Balance
31 $46.52 $303.48 $12,100.65
Month - Interst - Principle - Balance
32 $45.38 $304.62 $11,796.03
Month - Interst - Principle - Balance
33 $44.24 $305.76 $11,490.27
Month - Interst - Principle - Balance
34 $43.09 $306.91 $11,183.35
Month - Interst - Principle - Balance
35 $41.94 $308.06 $10,875.29
Month - Interst - Principle - Balance
36 $40.78 $309.22 $10,566.07
Month - Interst - Principle - Balance
37 $39.62 $310.38 $10,255.70
Month - Interst - Principle - Balance
38 $38.46 $311.54 $9,944.16
Month - Interst - Principle - Balance
39 $37.29 $312.71 $9,631.45
Month - Interst - Principle - Balance
40 $36.12 $313.88 $9,317.56
Month - Interst - Principle - Balance
41 $34.94 $315.06 $9,002.50
Month - Interst - Principle - Balance
42 $33.76 $316.24 $8,686.26
Month - Interst - Principle - Balance
43 $32.57 $317.43 $8,368.84
Month - Interst - Principle - Balance
44 $31.38 $318.62 $8,050.22
Month - Interst - Principle - Balance
45 $30.19 $319.81 $7,730.41
Month - Interst - Principle - Balance
46 $28.99 $321.01 $7,409.40
Month - Interst - Principle - Balance
47 $27.79 $322.21 $7,087.18
Month - Interst - Principle - Balance
48 $26.58 $323.42 $6,763.76
Month - Interst - Principle - Balance
49 $25.36 $324.64 $6,439.12
Month - Interst - Principle - Balance
50 $24.15 $325.85 $6,113.27
Month - Interst - Principle - Balance
51 $22.92 $327.08 $5,786.20
Month - Interst - Principle - Balance
52 $21.70 $328.30 $5,457.89
Month - Interst - Principle - Balance
53 $20.47 $329.53 $5,128.36
Month - Interst - Principle - Balance
54 $19.23 $330.77 $4,797.59
Month - Interst - Principle - Balance
55 $17.99 $332.01 $4,465.58
Month - Interst - Principle - Balance
56 $16.75 $333.25 $4,132.33
Month - Interst - Principle - Balance
57 $15.50 $334.50 $3,797.83
Month - Interst - Principle - Balance
58 $14.24 $335.76 $3,462.07
Month - Interst - Principle - Balance
59 $12.98 $337.02 $3,125.05
Month - Interst - Principle - Balance
60 $11.72 $338.28 $2,786.77
Month - Interst - Principle - Balance
61 $10.45 $339.55 $2,447.22
Month - Interst - Principle - Balance
62 $9.18 $340.82 $2,106.40
Month - Interst - Principle - Balance
63 $7.90 $342.10 $1,764.30
Month - Interst - Principle - Balance
64 $6.62 $343.38 $1,420.91
Month - Interst - Principle - Balance
65 $5.33 $344.67 $1,076.24
Month - Interst - Principle - Balance
66 $4.04 $345.96 $730.28
Month - Interst - Principle - Balance
67 $2.74 $347.26 $383.01
Month - Interst - Principle - Balance
68 $1.44 $348.56 $34.45
Month - Interst - Principle - Balance
69 $0.13 $349.87 ($315.42)
Кто-нибудь может помочь мне добраться до 0?
Комментарии:
1. мне нужно получить 0,00 доллара, но я получаю только (315,42 доллара)
2. Подумайте о том, где
Console.WriteLine($"Month - Interst - Principle - Balance");
находится, и сравните это с вашим выводом — это довольно просто.3. Эмм, удалите
Console.WriteLine($"Month - Interst - Principle - Balance");
?4. Следует также отметить, что вы ничего не делаете с округленными значениями:
decimal.Round(APR);
должно бытьAPR = decimal.Round(APR);
5. Я предполагаю
decimal.Round(loan = loan TAX2 - monthlypayment);
, что должно быть записано какloan = decimal.Round(loan TAX2 - monthlypayment);
Ответ №1:
Обратите внимание, что ваш последний платеж — это не полная сумма платежа — с произвольным APR и суммой платежа вы не всегда получите полный, равномерный график амортизации. Если вы хотите просто показать меньший платеж в конце, просто измените
decimal Tax3 = monthlypayment - TAX2;
loan = loan TAX2 - monthlypayment;
decimal.Round(loan,2);
Для
decimal Tax3 = Math.Max(monthlypayment - TAX2, loan) ;
loan = loan - Tax3;
loan = decimal.Round(loan,2);
Это исправит три вещи:
- ограничьте основную сумму оставшимся основным балансом
- повторно используйте значение основной суммы в формуле уменьшения баланса
- захват результата
round
(округление не изменяет исходное значение — оно возвращает округленное значение
Ответ №2:
Попробуйте это
class Program
{
private static Ink InkOverlay { get; set; }
public static async Task Main(string[] args)
{
Console.WriteLine("hello what is your car loan amount.");
decimal loan = decimal.Parse(Console.ReadLine());
Console.WriteLine("What is your APR");
decimal APR = decimal.Parse(Console.ReadLine());
Console.WriteLine("What is the monthly payment");
decimal monthlypayment = decimal.Parse(Console.ReadLine());
int currentmonth = 0;
int u = 0;
int c = 1;
while (loan > 0.00m)
{
decimal.Round(APR);
decimal TAX = APR / 12.00m / 100.00m;
decimal.Round(TAX);
decimal TAX2 = TAX * loan;
if((loan TAX2) < monthlypayment)
{
monthlypayment = loan TAX2;
}
decimal Tax3 = monthlypayment - TAX2;
decimal.Round(loan = loan TAX2 - monthlypayment);
currentmonth ;
Console.WriteLine($"Month - Interst - Principle - Balance");
Console.WriteLine($"{currentmonth} {TAX2.ToString("C")} {Tax3.ToString("C")} {loan.ToString("C")}");
}
}
}
Ответ №3:
Измените свой код на это:
Console.WriteLine($"Month - Interst - Principle - Balance");
while (loan > 0.10m)
{
decimal TAX = APR / 12.00m / 100.00m;
decimal TAX2 = decimal.Round(TAX * loan, 2);
decimal Tax3 = decimal.Round(monthlypayment - TAX2, 2);
if (loan > monthlypayment-TAX2) loan = loan TAX2 - monthlypayment;
else
{
Tax3 = loan TAX2;
loan = 0m;
}
currentmonth ;
Console.WriteLine($"{currentmonth} {TAX2.ToString("C")} {Tax3.ToString("C")} {loan.ToString("C")}");
}
Комментарии:
1. я все еще не могу получить баланс в размере 0,00 доллара. Есть ли что-то еще, чего мне не хватает
2. Пожалуйста, сообщите мне значения loan, apr и motnlypayment, и я вам помогу.
3. Вы изменили неправильный код
decimal.Round(APR);
на другой неправильный кодdecimal.Round(APR,2);
. Не могли бы вы показать OP, как это должно быть сделано?4. кредит 21000 годовых 4,5 ежемесячно 350
Ответ №4:
Я немного переписал ваш код, чтобы показать, как это лучше всего структурировать.
Я специально переименовал переменные, чтобы прояснить их значение.
Вот код.
Console.WriteLine("hello what is your car loan amount.");
decimal loanPrincipal = Math.Round(decimal.Parse(Console.ReadLine()), 2);
Давайте сразу округлим это. Поскольку мы используем decimal
любые вычисления, включающие сложение и вычитание округленных значений, гарантированно будут иметь округленный результат.
Console.WriteLine("What is your APR");
decimal apr = decimal.Parse(Console.ReadLine()) / 100m;
decimal mpr = (decimal)(System.Math.Pow(1.0 (double)apr, 1.0 / 12.0) - 1.0);
Давайте проанализируем apr
и сразу разделим на 100m
, чтобы получить значение, которое представляет процент.
А также давайте вычислим правильную месячную ставку. Просто помните, что если вы применяете ежемесячную процентную ставку 12 раз, то результирующее увеличение должно быть годовой ставкой. Это сложное вычисление, а не простое. Если вам было поручено использовать simple interest, вы можете изменить эту формулу на decimal mpr = apr / 12m;
.
Console.WriteLine("What is the monthly payment");
decimal monthlyPayment = Math.Round(decimal.Parse(Console.ReadLine()), 2);
Как и принципал, давайте разбирать и округлять одновременно.
Теперь цикл выглядит так:
Console.WriteLine($"Month - Principal - Interest - Payment - Balance");
for (int currentMonth = 1; ; currentMonth )
{
decimal monthlyInterest = Math.Ceiling(100m * loanPrincipal * mpr) / 100m;
monthlyPayment = Math.Min(monthlyPayment, loanPrincipal monthlyInterest);
decimal updatedPrincipal = loanPrincipal monthlyInterest - monthlyPayment;
Console.WriteLine(
"{0} {1} {2} {3} {4}",
currentMonth,
loanPrincipal.ToString("C"),
monthlyInterest.ToString("C"),
monthlyPayment.ToString("C"),
updatedPrincipal.ToString("C"));
loanPrincipal = updatedPrincipal;
if (loanPrincipal == 0m)
{
break;
}
}
Ключевой частью здесь является то, что я вычислил проценты, ежемесячный платеж и обновленную основную сумму в трех строках в начале цикла.
Проценты вычисляются с использованием Math.Ceiling
, а не Math.Round
так, как банки любят всегда получать целый цент независимо от дроби. Другими словами, им не нравится округление в меньшую сторону.
Ежемесячный платеж — это либо текущий ежемесячный платеж, либо сумма, необходимая для погашения кредита.
И я вычисляю обновленный принципал, чтобы упростить форматирование данных.
Затем я отображаю данные.
Наконец, я устанавливаю для основной суммы обновленную основную сумму, а затем вырываюсь из цикла, если кредит погашен.
Месяц - Основная сумма - Проценты - Платеж - Баланс 1 $5,000.00 $39.88 $500.00 $4,539.88 2 $4,539.88 $36.21 $500.00 $4,076.09 3 $4,076.09 $32.51 $500.00 $3,608.60 4 $3,608.60 $28.78 $500.00 $3,137.38 5 $3,137.38 $25.02 $500.00 $2,662.40 6 $2,662.40 $21.24 $500.00 $2,183.64 7 $2,183.64 $17.42 $500.00 $1,701.06 8 $1,701.06 $13.57 $500.00 $1,214.63 9 $1,214.63 $9.69 $500.00 $724.32 10 $724.32 $5.78 $500.00 $230.10 11 $230.10 $1.84 $231.94 $0.00