在.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
如果你给每个会计那样的东西,她都会吃掉你的。
在这里加上税,问题就会成倍增加。
因此,不要存储尽可能多的小数并尽可能晚地对其进行舍入。创建一个在财务上正确的类,并尽快对其进行四舍五入/截断存储。
发布于 2010-12-24 10:32:07
您当然不能创建从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
}
}
(显然,这里还需要更多的东西--特别是你需要覆盖GetHashCode
和Equals
,实现IEquatable<T>
等。)
但这真的是你想要的吗?我认为更常见的是在中间操作期间保持尽可能多的精度,并仅在最后时刻进行舍入,例如,用于存储在数据库中或显示给用户。
发布于 2010-12-24 10:34:56
您提出的内容不能直接完成(从decimal
这样的值类型派生)。这也不是一个好主意,因为每次算术运算后进行舍入都会在最终结果中引入越来越大的误差。
如果我理解正确的话,您想要实现的最好方法是正常使用decimal
,最后使用一次System.Math.Round
进行四舍五入。
发布于 2010-12-24 10:33:28
如果您使用:The Currency ("C") Format Specifier来输出十进制值,那么System.Decimal应该已经有了您需要的东西。
https://stackoverflow.com/questions/4525730
复制