我正在寻找用于财务数据的定点标准,您知道有什么值得尝试的吗?你对那个手工定点类的性能有什么经验吗?
7 回答
哎哟。金融系统很棘手,您的主要问题不是定点数学,而是舍入误差。
您可以拥有一个漂亮的电子表格,其中包含按客户类型和增值税计算的折扣。你做了一个总数,你把它提交给一个会计师,他说这些值都是错误的。原因:输出的格式可能只有 2 个小数位,但在内部,该值具有浮点数或双精度数的所有小数位。他们确实加起来了。
您需要了解您的财务状况并决定基值在哪里。这意味着会计师将检查哪些值(是的,它需要业务知识,提高“棘手”部分)。
在将值保存到持久形式(数据库、文件、内存......)之前,您会截断乘法和除法可能添加的额外小数位。
N个小数位的快速而肮脏的解决方案:((double)((int)(Value * N * 10.0)))/10.0
当然,您需要准确检查您的财务需要哪种四舍五入。
Dr.Dobb's 有一篇关于 C++ 中定点算术类型的可能实现的文章。看看这个。
我使用我的定点数学课。它旨在或多或少地替代浮动/双打。http://codef00.com/coding
编辑:作为旁注,我个人不会为此目的使用定点类。相反,我只会存储美分的数量(或十分之一美分,或需要的百分之一美分)。A 直接用它做数学。然后我会在向用户显示时适当地缩放值。
IBM 的decNumber++
试图直接回答
Markus Trenkwalder 有一个支持一些数学函数的函数 - http://www.trenki.net/content/view/17/1/:
该库包含用于处理定点数的各种函数(乘法、除法、求逆、sin、cos、sqrt、rsqrt)。它还包含一个 C++ 包装类,可用于大大简化使用定点数的工作。我将这个定点数类与我的 vector_math 库结合使用,以获得一个定点向量数学库。与浮点版本相比,这样做使 3D 计算快得多。
作者特意说他的平台不支持浮点,这就是他这样做的原因。另外,请注意,它是用于 3D 渲染的,问题是针对财务数据的,我们需要一个好的数学函数库......
IEEE 754-2008 Decimal Floating-Point Arithmetic 规范,针对金融应用
这看起来像是一种处理财务数据的既定方法,得到了很好的支持(来自英特尔和 IEEE) - http://software.intel.com/en-us/articles/intel-decimal-floating-point-math-library
去引用:
IEEE 754-2008 Decimal Floating-Point Arithmetic 规范,针对金融应用,特别是在法律要求必须使用十进制而不是二进制浮点算术的情况下(因为使用二进制浮点运算执行的计算可能会引入少量、但不可接受的错误)。
虽然它不是定点的,但我认为它对于寻求这个问题的答案的人来说非常有用。
一个 64 位的 int 类型应该足以以美分表示所有财务价值。
对于正确的一些定义,您只需要小心正确地舍入百分比。