2

.NET で、通貨として使用される decimal から派生した型を作成する方法があるので、算術演算を目的の小数点以下の桁数に丸めます。

そうでない場合、.NET でのベスト プラクティスは何ですか?

編集(動機):

価格があるとしましょう:

125.00 Rep$

0.25そして、私はそれの一部を販売しています。31.25

今、15% の割引があり、割引を計算して絶対値で表示するには、次のようにします。

31.25 * .85 = 26.5625

他の方法を使用する場合:

31.25 * .15 = 4.6875

たとえば、サードパーティに切り捨てて表示させると、次のようになります。

26.56 +
 4.68 =
-----
31.24

そして、あなたが彼女にそのようなものを与えれば、すべての会計士はあなたの囲炉裏を食べます.

ここに税金を追加すると、問題はさらに倍増します。

したがって、NO はできるだけ多くの小数を格納し、できるだけ遅く丸めます。財務的に正しいことを行うクラスを作成し、できるだけ早く丸め/切り捨てて保存します。

4

3 に答える 3

3

構造体であるため、から派生した型を作成することはdecimalできません。また、構造体のサブタイプを作成することもできません。

ただし、小数を含む独自の構造体を作成することもできます。基本的に含まれている10進値に対して算術を実行し、適切に丸めるために、すべての算術演算子をオーバーロードする必要があります。Currency

例えば:

public struct Currency
{
    private readonly decimal value;

    public Currency(decimal value)
    {
        this.value = decimal.Round(value, 2);
    }

    public override string ToString()
    {
        return value.ToString();
    }

    public static Currency operator+(Currency left, Currency right)
    {
        return new Currency(left.value + right.value);
    }

    public static Currency operator-(Currency left, Currency right)
    {
        return new Currency(left.value - right.value);
    }

    public static Currency operator/(Currency left, int right)
    {
        return new Currency(left.value / right);
    }
}

class Test
{
    static void Main()
    {
        Currency currency = new Currency(15);
        Console.WriteLine(currency / 10); // Prints 1.5
        Console.WriteLine(currency / 100); // Prints 0.15
        Console.WriteLine(currency / 1000); // Prints 0.2
    }
}

(明らかに、ここにはもっと多くのことが必要です-特に、オーバーライドGetHashCodeしてEquals、実装する必要がありますIEquatable<T>。)

これは間違いなくあなたが望むものですか?データベースへの保存やユーザーへの表示など、中間操作中はできるだけ精度を維持し、最後の瞬間にのみ丸めるのが一般的だと思いました。

于 2010-12-24T10:32:06.717 に答える
1

提案することを直接行うことはできません(のような値型から派生decimal)。また、すべての算術演算の後に丸めると、最終結果にますます大きなエラーが発生するため、これはお勧めできません。

私が正しく理解していれば、達成したいことはdecimal、通常どおりに使用System.Math.Round し、最後に1回使用して丸めることが最適です。

于 2010-12-24T10:34:56.270 に答える
0

System.Decimalには、次のものを使用する場合、必要なものがすでに含まれているはずです。通貨( "C")形式指定子を使用して10進値を出力します。

于 2010-12-24T10:33:28.077 に答える