为什么应用程序通常不使用整数数据类型(例如int
or long
在 C++/Java/C# 中)在内部表示货币值,而不是使用浮点数据类型 (float
, double
)或者类似Java的BigDecimal
?
例如,如果我正在编写一个 Java 应用程序,并且有一个变量想要表示美元的实际值(不需要表示便士的分数),我可以声明一个int
表示分数的值。例如,值“$1.00”将表示为 100。这似乎是使用double
(参见问题为什么不使用 Double 或 Float 来表示货币? https://stackoverflow.com/questions/3730019/why-not-use-double-or-float-to-represent-currency) or a BigDecimal
(这是一个比简单基元更重量级的对象int
).
显然,在向用户显示整数值之前,或者在用户输入货币值时,需要将整数值“转换”(即从 100 转换为“$1”或“$1.00”),但这样做似乎并不重要比格式化更麻烦double
or a BigDecimal
用于显示。
为什么在不需要表示美分分数(或其他货币类型的等价物)的应用程序中,这种方法不是最佳实践?
为什么应用程序通常不使用[整数]在内部表示货币值?
它不适合简单的编码。 1.10 美元相当于 110 美分。好的,但是当您需要计算税金时该怎么办(即 1.10 美元 * 4.225% - 密苏里州的税率,结果为 0.046475 美元)。要将所有资金保留为整数,您还必须将销售税转换为整数 (4225),这需要将 110 美分进一步转换为 11000000。数学计算结果为 11000000 * 4225 / 100000 = 464750。这是这是一个问题,因为现在我们的值以美分为单位(分别为 11000000 和 464750)。所有这一切都是为了将钱存储为整数。
因此,用本机货币来思考和编码会更容易。在美国,这将以美元为单位,美分为小数(即 1.10 美元)。用 110 美分进行编码并不那么自然。使用以 10 为基数的浮点数(例如 Java 的BigDecimal
和 .NET 的Decimal
)通常对于货币值来说足够精确(与以 2 为基数的浮点数相比,例如Float
and Double
).
为什么在不需要表示美分分数(或其他货币类型的等价物)的应用程序中,这种方法不是最佳实践?
我认为上面的第一点表明,很难摆脱需要表示美分的分数,至少在计算销售税时是这样——这在商业应用程序中很常见。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)