gpt4 book ai didi

c++ - 为什么在财务计算中应该使用十进制 float ,但它有舍入误差

转载 作者:太空狗 更新时间:2023-10-29 20:24:41 25 4
gpt4 key购买 nike

我目前正在使用 C++ 从事与股票市场相关的项目,涉及很多 float 类型,如价格和指数。

我读到很多说你应该在与货币相关的算术中使用十进制 float 。 Why not use Double or Float to represent currency? Difference between decimal, float and double in .NET?

根据我的理解,float 和 decimal float 之间的区别在于解释指数部分的底数,float 使用 2 作为底数,decimal float 使用 10。当使用 decimal float 时你仍然会遇到舍入错误,你仍然无法表达1/3(如果我错了请纠正我),我猜很有可能将某人的帐户余额乘以30%然后出现舍入误差,经过更多计算后,舍入误差可能会传播得更严重。除了更大的数字范围外,为什么我要在金融算术中使用小数 float ?

最佳答案

根据您进行的金融交易,舍入误差可能是不可避免的。如果一件商品的价格为 1.50 美元并征收 7% 的销售税,则不会向您收取 1.605 美元;您支付的价格将是 1.60 美元或 1.61 美元。 (美国货币单位理论上包括“mils”,即千分之一美元,但最小面额的硬币是 0.01 美元,几乎所有交易都四舍五入到最接近的美分。)

如果您进行简单的计算(只是加减数量并将它们乘以整数),所有结果都将是整数美分。如果您使用二进制 float 表示美元数,则大多数金额将无法表示;应该产生 0.01 美元的计算可能产生 0.01000000000000000020816681711721685132943093776702880859375。

您可以通过使用整数来表示美分数(或者,如果语言支持,则等效地使用定点数)或使用可以精确表示 0.01 的十进制 float 来避免该问题。

但是对于更复杂的操作,例如计算 7% 的销售税、将一笔钱分成 3 等份,或者特别是复利,除非您使用任意的 -精密包装如GMP .

据我了解,有一些法律法规明确如何解决舍入误差。如果你对 1.50 美元征收 7% 的销售税,你就不能合法地在 1.60 美元和 1.61 美元之间进行选择;法律会准确地告诉您哪一个在法律上是正确的。

如果您正在编写供其他人使用的财务软件,您需要了解法规的确切内容。知道这一点后,您就可以确定哪种表示法(整数、定点数、十进制 float 等)最适合用于获得法律要求的结果。

(免责声明:我不知道这些规定到底说了什么。)

关于c++ - 为什么在财务计算中应该使用十进制 float ,但它有舍入误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26764807/

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