1

C# を使用して課金システムのアプリケーションを作成しました。

顧客がキャッシャーに支払うのを容易にするために、合計請求額を切り上げまたは切り捨てることができます。セントで終わる最後の値によって異なります。データ型を小数として計算を行います。

0.00、0.01、0.02セントで終わる場合は0.00 に切り捨てられます

例:

  • 10.00、10.01、または 10.02 は 10.00 に切り捨てます
  • 10.10、10.11、または 10.12 は 10.10 に切り捨てます

0.03、0.04、0.05セントで終わる場合は、0.05切り上げます。

例:

  • 10.03、10.04、または 10.05 は 10.05 に切り上げます
  • 10.13、10.14、または 10.15 は 10.15 に切り上げます

末尾が 0.05、0.06、0.07 セントの場合は0.05切り捨てられます

例:

  • 10.05、10.06、または 10.07 は 10.05 に切り捨てられます
  • 10.15、10.16、または 10.17 は 10.15 に切り捨てられます

末尾が 0.08 または 0.09 セントの場合** 0.10に切り上げられます

例:

  • 10.08 または 10.09 は 10.10 に切り捨てられます
  • 10.18 または 10.19 は 10.20 に切り捨てられます

問題は、答えが異なり、システム要件を満たしていないため、Math.Roundを使用できないことです。私の合計請求額が 10.14であるとしましょう。切り捨てられて 10.10になりますが、答えは切り上げて 10.15 になります。

誰かがこの問題を解決するのを手伝ってくれることを願っています。

4

3 に答える 3

3

最後の桁をチェックする拡張方法を提案するつもりでした。しかし、単純に乗算して、正しいラウンド タイプを使用していることを確認するだけで、これを行うことができます。

この答えからほとんどそれを得ることができます。

最も近い 0.5 に丸めるにはどうすればよいですか?

于 2013-03-28T07:39:22.533 に答える
3

簡単な答えは次のとおりです。

public decimal Round(decimal value)
{
    return Math.Round(value * 20) / 20;
}
于 2013-03-28T08:00:28.113 に答える
0
static public decimal RoundToNickel(decimal value)
{
    var mod = value % 0.05M;

    if (mod >= 0.03M)
    {
        return value + 0.05M - mod;
    }

    return value - mod;
}
于 2013-03-28T07:48:39.583 に答える