【发布时间】:2015-11-19 15:24:54
【问题描述】:
TL;DR1用 C 表示货币或金钱的准确且可维护的方法是什么?
问题的背景:
许多其他语言已经回答了这个问题,但我找不到 C 语言的可靠答案。
Objective-C How to represent money in Objective-C / iOS?
注意:对于其他语言还有很多类似的问题,我只是出于代表性目的提取了一些。
所有这些问题都可以归结为“使用decimal 数据类型”,具体类型可能因语言而异。
有一个related question 最终建议使用“定点”方法,但没有一个答案涉及使用 C 中的特定数据类型。
同样,我查看了任意精度库,例如 GMP,但我不清楚这是否是最好的使用方法。
简化假设:
假设是基于 x86 或 x64 的架构,但请指出任何会影响基于 RISC 的架构(例如 Power 芯片或 Arm 芯片)的假设。
计算的准确性是首要要求。 Ease of maintenance 将是下一个要求。计算速度很重要,但比其他要求更重要。
计算需要能够安全地支持精确到 mill 的操作以及支持高达数万亿 (10^9) 的值
与其他问题的区别:
如上所述,此类问题之前已针对多种其他语言提出过。由于几个原因,这个问题与其他问题不同。
使用来自Why not use Double or Float to represent currency? 的公认答案,让我们突出显示差异。
(解决方案 1) 几乎适用于任何语言的解决方案是使用整数,并计算美分。例如,1025 将是 10.25 美元。几种语言也有处理金钱的内置类型。 (方案二)其中Java有BigDecimal类,C#有decimal类型。
添加了强调以突出显示两个建议的解决方案
第一个解决方案本质上是“定点”方法的变体。此解决方案存在一个问题,即建议的范围(跟踪美分)不足以进行基于工厂的计算,并且在舍入时会丢失重要信息。
另一种解决方案是使用 C 中不可用的原生 decimal 类。
同样,答案不考虑其他选项,例如创建用于处理这些计算的结构或使用任意精度库。这些差异是可以理解的,因为 Java 没有结构,而且当该语言有本机支持时,为什么要考虑使用 3rd 方库。
这个问题与那个问题和其他相关问题不同,因为 C 没有相同级别的原生类型支持,并且具有其他语言没有的语言特性。而且我还没有看到任何其他问题涉及可以在 C 中解决的多种方式。
问题:
根据我的研究,由于浮点错误,float 似乎不是用于在 C 程序中表示货币的合适数据类型。
我应该用什么来表示 C 中的钱,为什么这种方法比其他方法更好?
1这个问题以较短的形式开始,但收到的反馈表明需要澄清这个问题。
【问题讨论】:
-
您始终可以使用美分并使用
int、long或long long。 -
我不知道是否是最好的方法,但我见过几个人使用由两个整数组成的结构,一个用于单位,另一个用于小数。
-
@Olaf - 谢谢你的链接。我已经对其进行了审查,并在我的问题中提到了它。这个问题集中在 Java 上,它具有与 C 不同的可用类型。
-
@Olaf - 我相信您指的是“几乎适用于任何语言的解决方案是使用整数,并计算美分。例如,1025 将是 10.25 美元。”如果您放弃十分之一或百分之一,该特定方法会丢失潜在的重要信息,如下面的棘轮怪胎所述。在 C 中不存在使用
decimal类型的另一个建议。此外,这个问题正在超越这些建议,以确定可以通过 3 或 4 种不同方式来确定最佳行动方案。跨度> -
@Olaf - 再次感谢您的帮助。在这一点上,我认为我们彼此之间的沟通并不清晰。请随时ping me in chat,以便我们可以在此处进一步讨论这些 cmets 之外的内容。