【发布时间】:2023-03-04 07:42:07
【问题描述】:
在 C# 中,我应该使用什么数据类型来表示货币金额?十进制?漂浮?双倍的?我要考虑:精度、舍入等。
【问题讨论】:
标签: c#
在 C# 中,我应该使用什么数据类型来表示货币金额?十进制?漂浮?双倍的?我要考虑:精度、舍入等。
【问题讨论】:
标签: c#
Decimal 值类型表示 十进制数,范围从正数 79,228,162,514,264,337,593,543,950,335 为负 79,228,162,514,264,337,593,543,950,335。 Decimal 值类型是合适的 对于需要的财务计算 大量显着积分 和小数位数,没有四舍五入 错误。 Decimal 类型不 消除四舍五入的需要。 相反,它可以最大限度地减少错误,因为 四舍五入。
System.Single (float) 和 System.Double (double) 都足够精确能够表示高精度浮点数而不会出现舍入误差。
【讨论】:
如果您使用 SQL,请在数据库中使用小数和货币。
【讨论】:
Decimal 是你想要的。
【讨论】:
在 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();
}
}
}
【讨论】:
考虑使用Money Type for the CLR。它是一种自定义值类型(结构),还支持货币并处理四舍五入问题。
【讨论】:
decimal 不包含任何关于我们正在处理的货币的信息。美元?欧元?还有什么?
在 C# 中,您应该使用“Decimal”来表示货币金额。
【讨论】:
对于快速而肮脏的事情,任何浮点基本类型都可以。
float 和 double 的问题在于它们都不能准确地表示 1/10,有时会导致惊人的万亿分之一美分。您可能听说过臭名昭著的 10¢ + 20¢。更实际地,尝试计算三件商品的 6% 销售税,每件税前价值为 39.99 美元。
此外,float 和 double 具有负无穷大和 NaN 之类的值,它们对于表示金钱毫无用处。所以decimal,可以精确代表1/10似乎是最好的选择。
但是,decimal 没有任何关于我们正在处理的货币的信息。例如,29.89 美元的金额是否等于 29.89 欧元? 29.89 美元 > 29.89 欧元?如何确保这些金额以正确的货币符号显示?
如果这些细节对您的程序很重要,那么您应该使用第三方库或创建自己的 CurrencyAmount 类(或任何您想要的名称)。
但如果这类事情对程序来说无关紧要,你可以只使用浮点类型。或者甚至可能是整数(例如,我在 Java 中的二十一点实现要求玩家输入整数的赌注)。
【讨论】: