我应该用什么数据类型来表示C#中的钱?

时间:2009-06-17 18:35:43

标签: c#

在C#中,我应该用什么数据类型来表示货币金额?十进制?浮动?双?我想考虑一下:精确度,舍入等等。

7 个答案:

答案 0 :(得分:75)

使用System.Decimal

  

十进制值类型表示   十进制数从正数   79,228,162,514,264,337,593,543,950,335   否定的   79,228,162,514,264,337,593,543,950,335。    十进制值类型是合适的   用于需要的财务计算   大量的重要积分   和小数位,没有四舍五入   错误。 十进制类型没有   消除了舍入的需要。   相反,它最大限度地减少了由于的错误   四舍五入。

System.Single (float)System.Double (double) 都不够精确能够表示高精度浮点数而不会出现舍入错误。

答案 1 :(得分:4)

如果您使用的是SQL,请在数据库中使用decimal和money。

答案 2 :(得分:3)

Decimal就是你想要的那个。

答案 3 :(得分:2)

在C#中,Decimal类型实际上是一个带有重载函数的结构,用于基数10中的所有数学和比较运算,因此它具有较少的重要舍入误差。另一方面,浮点(和双精度)类似于二进制的科学计数法。因此,当您知道所需的精度时,十进制类型会更准确。

运行此命令以查看2:

的准确性差异
using System;
using System.Collections.Generic;
using System.Text;

namespace FloatVsDecimal
{
    class Program
    {
        static void Main(string[] args) 
        {
            Decimal _decimal = 1.0m;
            float _float = 1.0f;
            for (int _i = 0; _i < 5; _i++)
            {
                Console.WriteLine("float: {0}, decimal: {1}", 
                                _float.ToString("e10"), 
                                _decimal.ToString("e10"));
                _decimal += 0.1m;
                _float += 0.1f;
            }
            Console.ReadKey();
        }
    }
}

答案 4 :(得分:0)

考虑使用Money Type for the CLR。它是一个自定义值类型(struct),它也支持货币并处理四舍五入的问题。

答案 5 :(得分:0)

在C#中您应该使用“十进制”来表示货币金额。

答案 6 :(得分:0)

对于某些快速而又肮脏的事情,任何浮点基元类型都可以。

floatdouble的问题在于它们都不能精确表示1/10,偶尔会产生令人惊讶的万亿分之一美分。您可能已经听说过臭名昭著的10¢+ 20¢。更现实的是,请尝试计算三个税前价值39.99美元的商品的6%营业税。

此外,floatdouble具有负无穷大和NaN之类的值,它们对于表示金钱毫无用处。因此decimal可以精确代表1/10,似乎是最好的选择。

但是,decimal没有提供有关我们所使用的货币的任何信息。例如,金额$ 29.89是否等于€29.89?是29.89美元> 29.89欧元吗?如何确保这些金额显示正确的货币符号?

如果这些细节对您的程序很重要,那么您应该使用第三方库或创建自己的CurrencyAmount类(或任何您想调用的类)。

但是,如果这种事情对程序无关紧要,则可以只使用浮点类型。甚至可能是整数(例如,我在Java中的二十一点实现要求玩家输入全额赌注)。