首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >派生decimal类型-固定精度

派生decimal类型-固定精度
EN

Stack Overflow用户
提问于 2010-12-24 18:29:25
回答 3查看 272关注 0票数 2

在.NET中,有没有一种方法可以创建一个从decimal派生的用作货币的类型,以便将算术运算四舍五入到所需的小数位数。

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

编辑(动机):

假设我有一个价格:

代码语言:javascript
运行
复制
125.00 Rep$

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

现在,我有15%的折扣,要计算折扣并将其表示为绝对值,我需要:

代码语言:javascript
运行
复制
31.25 * .85 = 26.5625

如果我使用其他方式:

代码语言:javascript
运行
复制
31.25 * .15 = 4.6875

例如,如果我让某个第三方控件截断并显示它,我可以:

代码语言:javascript
运行
复制
26.56 +
 4.68 =
-----
31.24

如果你给每个会计那样的东西,她都会吃掉你的。

在这里加上税,问题就会成倍增加。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-24 18:32:07

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

不过,您可以创建自己的包含小数的Currency结构。您可能希望重载所有算术运算符,以便基本上对包含的十进制值执行算术运算,然后适当地进行舍入。

例如:

代码语言:javascript
运行
复制
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
    }
}

(显然,这里还需要更多的东西--特别是你需要覆盖GetHashCodeEquals,实现IEquatable<T>等。)

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

票数 3
EN

Stack Overflow用户

发布于 2010-12-24 18:34:56

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

如果我理解正确的话,您想要实现的最好方法是正常使用decimal,最后使用一次System.Math.Round进行四舍五入。

票数 1
EN

Stack Overflow用户

发布于 2010-12-24 18:33:28

如果您使用:The Currency ("C") Format Specifier来输出十进制值,那么System.Decimal应该已经有了您需要的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4525730

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档