在C#中,我应该用什么数据类型来表示货币金额?十进制?浮动?双?我想考虑一下:精确度,舍入等等。
答案 0 :(得分:75)
十进制值类型表示 十进制数从正数 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)
对于某些快速而又肮脏的事情,任何浮点基元类型都可以。
float
和double
的问题在于它们都不能精确表示1/10,偶尔会产生令人惊讶的万亿分之一美分。您可能已经听说过臭名昭著的10¢+ 20¢。更现实的是,请尝试计算三个税前价值39.99美元的商品的6%营业税。
此外,float
和double
具有负无穷大和NaN之类的值,它们对于表示金钱毫无用处。因此decimal
可以精确代表1/10,似乎是最好的选择。
但是,decimal
没有提供有关我们所使用的货币的任何信息。例如,金额$ 29.89是否等于€29.89?是29.89美元> 29.89欧元吗?如何确保这些金额显示正确的货币符号?
如果这些细节对您的程序很重要,那么您应该使用第三方库或创建自己的CurrencyAmount
类(或任何您想调用的类)。
但是,如果这种事情对程序无关紧要,则可以只使用浮点类型。甚至可能是整数(例如,我在Java中的二十一点实现要求玩家输入全额赌注)。