Jas*_*son 3 c++ floating-point bigdecimal
我目前正在使用c ++从事与股票市场相关的项目,涉及很多浮动类型,如价格和指数.
我读了很多说你应该在货币相关算术中使用十进制浮点数. 为什么不使用Double或Float来表示货币? .NET中的decimal,float和double之间的区别?
根据我的理解,浮点数和十进制浮点数之间的区别在于指数部分被解释的基数,浮点数使用2作为基数,十进制浮点数使用10.当使用十进制浮点数时,你仍然有舍入错误,你仍然无法表达1/3 (纠正我,如果我错了),我想很有可能将某人的账户余额乘以30%然后发生轮回错误,经过几次计算后,舍入误差可能会传播得更严重.除了更大的数字范围,为什么我应该在金融算术中使用十进制浮点数?
根据您正在执行的金融交易,舍入错误可能是不可避免的.如果一件商品的价格为1.5美元,含7%的销售税,则不会收取1.605美元的费用; 您支付的价格为1.60美元或1.61美元.(美元货币单位理论上包括"密尔"或千分之一美元,但最小面额硬币是0.01美元,几乎所有交易都四舍五入到最接近的分数.)
如果您正在进行简单的计算(只需加上和减去数量并乘以整数),所有结果将是整数美分.如果使用表示美元数量的二进制浮点数,则大多数金额将无法表示; 应该产生0.01美元的计算可能会产生$ 0.01000000000000000020816681711721685132943093776702880859375.
您可以通过使用整数来表示分数(或等效地,如果语言支持使用定点)或使用可精确表示0.01的十进制浮点来避免该问题.
但是对于更复杂的操作,比如计算7%的销售税,将一笔钱划分为3个相等的部分,或者特别是复利,除非你使用任意精度的包,否则仍然会有不完全可表示的结果GMP.
据我了解,有些法律和法规确切地规定了如何解决舍入错误.如果您将7%的销售税应用到1.50美元,则不能合法地在1.60美元到1.61美元之间选择; 法律告诉你究竟哪一个在法律上是正确的.
如果您正在编写供其他人使用的财务软件,您需要确切了解法规所说的内容.一旦你知道了,你可以确定哪种表示(整数,定点,十进制浮点或其他)最适合用于获得法律要求的结果.
(免责声明:我不知道这些规定实际上是怎么说的.)
| 归档时间: |
|
| 查看次数: |
1166 次 |
| 最近记录: |