gpt4 book ai didi

c - 如何用 C 表示货币或金钱

转载 作者:太空狗 更新时间:2023-10-29 16:38:17 25 4
gpt4 key购买 nike

TL;DR1 什么是用 C 表示货币的准确且可维护的方法?


问题的背景:
许多其他语言已经回答了这个问题,但我找不到 C 语言的可靠答案。

注意:对于其他语言还有很多类似的问题,我只是出于代表性目的提取了一些。

所有这些问题都可以归结为“使用 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? , 让我们突出显示差异。

(Solution 1) A solution that works in just about any language is to use integers instead, and count cents. For instance, 1025 would be $10.25. Several languages also have built-in types to deal with money. (Solution 2) Among others, Java has the BigDecimal class, and C# has the decimal type.

添加强调以突出显示两个建议的解决方案

第一个解决方案本质上是“定点”方法的变体。此解决方案存在一个问题,即建议的范围(跟踪美分)不足以进行基于工厂的计算,并且重要信息将在四舍五入时丢失。

另一种解决方案是使用 C 中不可用的原生 decimal 类。

同样,答案不考虑其他选项,例如创建用于处理这些计算的结构或使用任意精度库。这些差异是可以理解的,因为 Java 没有结构,并且当语言中有 native 支持时为什么要考虑第 3 方库。

这个问题不同于那个问题和其他相关问题,因为 C 没有相同级别的本地类型支持,并且具有其他语言没有的语言特性。而且我还没有看到任何其他问题解决可以在 C 中处理的多种方法。


问题:
根据我的研究,由于浮点错误,float 似乎不是用于在 C 程序中表示货币的合适数据类型。

我应该用什么来表示 C 中的钱,为什么这种方法比其他方法更好?

1 这个问题以较短的形式开始,但收到的反馈表明需要澄清问题。

最佳答案

切勿使用 float 来存储货币。 float 不能表示十分之一或百分之一,只能表示二元有理数,即 p/q 形式的数字,其中 p 和 q 是整数,q 是 2 的幂。因此,任何表示美分的尝试比 0、25、50 或 75 美分需要一个近似值,而这些近似值会转化为可被利用的漏洞,让您赔钱。

相反,以美分(或任何货币的最小单位)存储整数值。当读取使用小数点格式化的值时,只需将整个货币单位和美分作为单独的字段读取,然后乘以 100(或 10 的适当次方)并相加。

关于c - 如何用 C 表示货币或金钱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32212213/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com