Types 为什么不';t应用程序通常使用int在内部表示货币值?
为什么应用程序通常不使用整数数据类型(例如C++/Java/C#中的Types 为什么不';t应用程序通常使用int在内部表示货币值?,types,currency,Types,Currency,为什么应用程序通常不使用整数数据类型(例如C++/Java/C#中的int或long)来在内部表示货币值,而不是使用浮点数据类型(float,double)或类似Java的bigdecimic)之类的数据类型 例如,如果我正在编写一个Java应用程序,我有一个变量,我想用美元表示一个实际值(不需要表示分币的分数),我可以声明一个表示分币数的int值。例如,“1.00美元”的值将表示为100。这似乎是使用double(参见问题)或BigDecimal(这是一个比简单的原语int更重的对象)的一个很
int
或long
)来在内部表示货币值,而不是使用浮点数据类型(float
,double
)或类似Java的bigdecimic
)之类的数据类型
例如,如果我正在编写一个Java应用程序,我有一个变量,我想用美元表示一个实际值(不需要表示分币的分数),我可以声明一个表示分币数的int
值。例如,“1.00美元”的值将表示为100。这似乎是使用double
(参见问题)或BigDecimal
(这是一个比简单的原语int
更重的对象)的一个很好的替代方法
显然,在向用户显示整数值之前,或在用户输入货币值时,需要将整数值“转换”(即从100转换为“$1”或“$1.00”),但这样做似乎并不比格式化用于显示的double
或BigDecimal
更麻烦
为什么在不需要表示美分分数(或其他货币类型中的等值)的应用程序中,这种方法不是一种最佳做法?整数类型
使用大多数整数数据类型来表示货币是个坏主意,因为:
- 对于普通应用而言,非常有限的可表示值范围李>
- 在处理分数值时施加额外负担
- 价值范围约为-21.5亿至+21.5亿-这本身不是任何会计/银行/严肃金融用途的选项李>
- 当仅使用最后两位数字表示小数部分时,范围缩小到-2150万到+2150万李>
- 如果乘法有效(不说混合精度计算),则范围将进一步缩小李>
长的
)可以计算多达92000万亿。当考虑到全球经济时,货币是以万亿计的——因此这不是一个合理的选择
浮点类型
使用浮点数据类型是个坏主意,因为它们本质上是不精确的,这是绝大多数货币计算的致命问题
合适的数据类型
使用定点或十进制数据类型是一个非常好的主意,因为它们通常没有浮点和整数数据类型的负属性:
- 代表值范围足够宽李>
- 精度可根据计算要求通过四舍五入进行调整李>
- 由于自然分数值处理,因此不会产生混淆李>
- 精确的十进制数表示法
多货币软件还需要处理不同货币具有不同法定精度的事实。四舍五入可能是由会计准则规定的。我认为gnucash使用了一种理性表示,存储了分子和分母。我没有数据来说明什么是最佳或常见的做法。浮点运算的优点是方便,缺点是不精确。就个人而言,我不会使用浮点。为什么应用程序通常不使用[整数]在内部表示货币值?
BigDecimal
和.NET的Decimal
)通常对货币值足够精确(相比之下,以2为基数的浮点数,如Float
和Double
)我认为上面的数字1表明,至少在计算销售税时,很难不需要表示美分的分数,这在商业应用程序中很常见。或者,也许更好:为什么应用程序不使用专门为处理货币单位而设计的数据类型