首页 > 解决方案 > 如何防止十进制变量类型的货币舍入错误?

问题描述

我正在研究付款计划计算器。我从 'double' 切换到 'decimal' 变量类型以防止舍入错误,但我仍然在某个地方得到一个。我想出了这个数据集来测试我的代码,因为有一个明显的余数:

余额:$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 美元

我已经重构这段代码好几个小时了,我觉得我错过了一些非常简单的东西。

标签: c#decimalrounding-error

解决方案


在申请之前,您不会四舍五入首付金额。因此,对于支付约 119.52777777777 美元的人,您将得到正确的结果,没有(或非常小)舍入错误

如果您在将分期付款金额存储在 installmentAmount 变量中之前对其进行四舍五入,您可能会得到您正在寻找的答案。


推荐阅读