構造体であるため、から派生した型を作成することは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>。)
これは間違いなくあなたが望むものですか?データベースへの保存やユーザーへの表示など、中間操作中はできるだけ精度を維持し、最後の瞬間にのみ丸めるのが一般的だと思いました。