Я работаю над калькулятором плана платежей. Я переключился с «двойных» на «десятичные» типы переменных, чтобы избежать ошибок округления, но я все еще где-то получаю их. Я придумал этот набор данных, чтобы использовать его для тестирования своего кода, потому что есть четкий остаток:
Баланс: 1 575,75 $
Авансовый платеж: $ 500,00
Оставшийся остаток: $ 1 075,75
Количество платежей после первого взноса: 9
Сумма взноса: $ 119,53 (х8)
Остаток: 119,51
Я переключил свои типы данных с двойного на десятичный (очевидно)
Я пытался переписать код несколько раз, вычисляя одни и те же вещи по-разному (вот почему некоторые математические вычисления на данный момент меньше, чем «минималистские»)
Я попытался сделать мой код более модульным, чтобы найти ошибку округления
// Method within my WinForms project
public void CalculateInstallmentPayments()
{
decimal currentBalance = Convert.ToDecimal(txtBalanceInput.Text); // Current Balance
decimal downPayment = Convert.ToDecimal(txtDownPayment.Text); // Down Payment
decimal installmentCount = sliderRemainingPmtCount.Value; // Installment Count
decimal balanceAfterDP = currentBalance - downPayment; // Balance After Down Payment
decimal installmentAmount = (balanceAfterDP / installmentCount); // Installment Amount
decimal remainderPayment = (balanceAfterDP - (installmentAmount * (installmentCount - 1))); // Final Payment (Remainder)
// Using Rich Text box as a 'Console' for debugging
rtxtNotate.Text = ($"Current Balance: {currentBalance.ToString()}\nDown Payment: {downPayment.ToString("C")}\n" +
$"Installment Count: {installmentCount.ToString()}\nInstallment Amount: {installmentAmount.ToString("C")}\n" +
$"Remainder: {remainderPayment.ToString("C")}\n");
}
В настоящее время это вывод:
Текущий баланс: 1575,75
Авансовый платеж: $ 500,00
Количество взносов: 9
Сумма взноса: $ 119,53
Остаток: $ 119,53 - это ошибка округления. Стоит читать 119,51
Я часами рефакторинг этого кода, и я чувствую, что мне не хватает чего-то невероятно простого.