为什么应用程序通常不使用整数数据类型(例如int或long在C++/Java/C#中)来在内部表示货币值,而不是使用浮点数据类型(float,double)或类似Java的BigDecimal?
例如,如果我正在编写Java应用程序并且我有一个变量,我想用美元表示实际值(不需要代表几分钱),我可以声明一个代表分数的int值.例如,值"$ 1.00"将表示为100.这似乎是使用a的好方法double(请参阅问题为什么不使用Double或Float来表示货币?)或a BigDecimal(这是一个比简单更重量级的对象)原始的int).
显然,在将值显示给用户之前,或者在用户输入货币值之前,整数值需要"翻译"(即从100到"1美元"或"1.00美元"),但这样做似乎并不显着比格式化double或BigDecimal显示更麻烦.
为什么这种方法在不需要代表分数(或其他货币类型的等价物)的应用程序中不是最佳实践?
Mat*_*att 11
为什么应用程序通常不使用[整数]来内部表示货币值?
它不适用于简单的编码.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和Double).
为什么这种方法在不需要代表分数(或其他货币类型的等价物)的应用程序中不是最佳实践?
我认为上面的数字1显示,很难摆脱需要代表分数的分数,至少在计算销售税时是这样 - 这在商业应用中很常见.
使用大多数 整数数据类型来表示货币是一个坏主意,因为:
具体地,限制值范围可能是具有较短整数类型的严重问题.让我们考虑一个常见的32位有符号整数(通常是a int):
使用64位有符号整数(通常为a long),您可以计算多达9.2万亿.在考虑全球经济时,资金被计入数万亿 - 因此这不是一个合理的选择.
使用浮点数据类型是一个坏主意,因为它们本质上是不精确的,这对绝大多数货币计算来说都是致命的问题.
使用定点或十进制数据类型是一个非常好的主意,因为它们通常没有负值属性作为浮点和整数数据类型:
最后但并非最不重要的是,合适的数据类型在很大程度上取决于语言及其功能.
此外,在许多计算场景中,有必要对中间计算和结果值使用不同的精度.虽然结果通常必须用相应法则为特定货币定义的精度来表示,但中间计算可能涉及更高精度的中间结果.例如,贷款支付的百分比计算,保险费用等,或货币转换,其中汇率通常以更高的精度给出.
多货币软件还需要处理不同货币具有不同合法精确度的事实.会计标准可能会导致舍入.