2

.NET 中有没有一种方法可以创建派生自十进制的类型,该类型将用作货币,因此它将算术运算四舍五入到所需的小数位数。

如果不是,那么 .NET 中的最佳实践是什么?

编辑(动机):

假设我有一个价格:

125.00 Rep$

我卖掉0.25它的一部分,这相当于31.25

现在,我有 15% 的折扣,要计算折扣并以绝对值呈现,我将有:

31.25 * .85 = 26.5625

如果我使用其他方式:

31.25 * .15 = 4.6875

例如,如果我让一些第 3 方控件截断并显示它,我可以:

26.56 +
 4.68 =
-----
31.24

如果你给她这样的东西,每个会计师都会吃掉你的壁炉。

在这里加税,问题会进一步增加。

因此,不要存储尽可能多的小数并尽可能晚地将其四舍五入。创建一个在财务上正确的类,并尽快将其存储为舍入/截断。

4

3 回答 3

3

您当然不能创建派生自 的类型decimal,因为它是一个结构 - 并且您不能创建结构的子类型。

不过,您可以创建自己的包含小数的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
    }
}

(显然这里还有很多需要 - 特别是您需要覆盖GetHashCodeand Equals,实现IEquatable<T>等)

这绝对是你想要的吗?我认为在中间操作期间保持尽可能高的精度更为常见,并且仅在最后一刻进行,例如存储在数据库中或显示给用户。

于 2010-12-24T10:32:06.717 回答
1

您建议的内容不能直接完成(从类似的值类型派生decimal)。这也不是一个好主意,因为每次算术运算后的舍入都会在最终结果中引入越来越大的误差。

如果我理解正确,你想要达到的效果最好是decimal正常使用System.Math.Round ,最后使用一次进行舍入。

于 2010-12-24T10:34:56.270 回答
0

System.Decimal 应该已经有你需要的东西,如果你使用:货币(“C”)格式说明符来输出一个十进制值。

于 2010-12-24T10:33:28.077 回答