Я работаю над калькулятором плана платежей. Я переключился с «двойных» на «десятичные» типы переменных, чтобы предотвратить ошибки округления, но я все еще где-то их получаю. Я придумал этот набор данных, чтобы использовать его для тестирования своего кода, потому что есть явный остаток:
Баланс: 1 575,75 долл. США
Первоначальный взнос: 500,00 долл. США
Остаток: 1 075,75 долл. США
Количество платежей после первоначального взноса: 9
Сумма платежа: 119,53 долл. США (x8)
Остаток: 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 доллара.
Я рефакторил этот код часами и чувствую, что упускаю что-то невероятно простое.