- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
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/
现在已知如下问题,并告诉你这题可以用网络流来解决,你该怎么做,该怎么建出网络流的模型? 一些前提: 显然可以发现绝不可能走横向向左的边,但可能走竖向向上的边(如下图) 那么图其实就是这样的:
条件: 我们需要我们 Magento 网站的默认显示货币是美元,Paypal(基础货币)也需要是美元(因为我们需要客户以美元支付)。 我们的 Fedex a/c 是在新加坡开设的,结果发现运费是以新加
根据 currency_str 和 created_date_time 合并两个数据帧(xrate 和 df)时遇到问题 display(xrate.info()) Int64Index: 1611
我必须匹配像 这样的值 € 6.483,00 或类似的值 18,50% 或者,再次, +65,86 % 在我起草的 Javascript 函数中: function(s) { return /^
我正在尝试将货币金额解析并存储为 BigDecimal 值。我得到了相关货币的区域设置,在大多数情况下它工作正常,但当货币是哥斯达黎加科朗时我得到了意想不到的结果。 我的哥斯达黎加客户告诉我,典型的货
在当前版本的 Excel(Office 365/2019 年 2 月)中获得近似每日外汇汇率的最简单的免费方法是什么。 我对历史数据不感兴趣,我只想要从货币 X 到货币 Y 的最后已知日汇率,并且只在
我在 spree 时遇到了麻烦,不知道如何处理。 我无法更改主要货币。 我该怎么做? 最佳答案 它在 Spree 2.0.0 中更容易,而且显然它也可以在以前的 spree 版本中工作。 转到您的 c
在我的网络应用程序中,我有一个名为“预算”的输入字段,用户可以在其中输入项目的建议预算。我需要创建一个屏蔽输入,以便在用户在输入字段中输入时自动将输入的金额转换为以下格式: 1000 10 000 1
我正在从数据库返回一个字符串,但由于数据库的编码方式,一些英镑符号 (£) 被问号取代。我想恢复井号,但不替换字符串中真正的问号。我已经设法编写了一个正则表达式来测试问号后跟数字的组合,但我不确定如何
我在使用亚马逊销售 API 时遇到问题。我在 amazon.co.uk 有一个帐户,可以正常发送产品。我在 amazon.de 有一个新帐户,除了货币外,一切都很好。 我有一个零售价为 10 英镑 (
Pharo 有什么方法可以将数字转换为单词。 例如:1200 = 一千二百而已。 实现起来并不难,只是想知道。 最佳答案 Integer>>asWords会这样做。 1200 asWords返回 'o
我有一个简单的单页网络应用程序。它从两个不同的 API 获取货币数据(以美元为单位),在成功检索后,promise 被解决,一些计算得出 GBP/Bitcoin 汇率。 我正试图找到一种干净的方法,然
我有以下简单的计算,它将两个值加在一起。这些值与使用“R”作为前缀标识的兰特(南非货币)有关。 function calculate() { var A = parseFloat(docume
使用 JavaScript,什么是将点替换为逗号的正确方法(对于欧盟货币),例如: 2000.65 将是 2000,65 而不是 2,000.65 39.20 将是 39,20 我不确定 cost.r
我在文本框中显示带有 NumberFormat 的货币符号 NumberFormat numberFormat = NumberFormat.getSimpleCurrencyFo
我已经设法从非接触式阅读器读取了一个交易事件,使用 现在我的 Activity 打开了,我被困在那个点上,因为我认为我的 Intent 中会有一些数据,比如 amou
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 Improve th
这个问题在这里已经有了答案: Why not use Double or Float to represent currency? (16 个答案) 关闭 3 年前。 我的应用程序中的一些计算有问题
我使用 Jruby(反正就是 ruby,在 jvm 下运行 :D )和马拉松测试(一个 java swing 应用程序),我在处理货币数字时遇到了一些麻烦。 我不使用 Rails(不知道我是否可以
我正在尝试删除 、 或 之后的尾随零。 以一种货币表示,仍然保留货币符号。例如,€90.00 到 €90、90.00€ 到 90€ 和 €90.33 到 €90.33。 示例如下: $('.produ
我是一名优秀的程序员,十分优秀!