使用十进制与双精度浮点数的应用程序区别。

7

我想知道人们是否在财务应用中使用十进制而不是双精度浮点数。我看到很多人在各个地方使用双精度浮点数,但结果并不如意...

您是否看到其他人犯这个错误...

7个回答

8
我们不得不将所有的双精度数转换为小数,这是我们的失误,我们感到非常遗憾。小数对于金融应用来说是很好的。你可以查看这篇文章《CLR的货币类型》:

这是一个方便、高性能的CLR货币结构,它处理算术运算、货币类型、格式化和仔细的分配和舍入而不会丢失精度。


5

在金融领域使用float或者double是一个常见的错误,会导致很多痛苦。在这种情况下,decimal是最明显的选择。

对于一般知识,可以在这里讨论每个选项:这里(float/double)和这里(decimal)。


2
这并不像你想的那样明显。最近,一家大型公司的控制器告诉我,他希望他的财务报表与Excel生成的报表相匹配,这意味着在内部保持计算结果的最大精度,并仅在显示时进行四舍五入。这意味着,仅使用显示值进行手动计算并不能始终匹配Excel的答案。他的解释是,有多种算法可以生成结果,每个算法都在不同的地方使用小数值进行四舍五入,因此可能会产生冲突的答案,但是Excel方法总是生成相同的答案。
我个人认为他是错的,但是由于很多财务人员不了解如何正确使用Excel进行财务计算,我敢打赌有很多人会同意这位控制器的观点。
我不想引发宗教战争,但我很想听听其他人的意见。

非程序员常常会坚持要求程序产生与他们现在使用的系统相同的结果。我曾经参与过开发的软件中,使用了一个近似的表格查找而不是更准确的直接计算,以便结果与手动获取的结果匹配。 - Mark Bessey

1
如果涉及到“科学”测量(例如重量、长度、面积等),请使用双精度浮点数。 如果涉及财务或者与法律有关的东西(例如房地产面积),请使用小数。 难点在于四舍五入。 如果税率是2.4%,您是在详细信息中还是在求和后进行四舍五入? 大多数情况下,需要同时进行两者(并修复差异)。

1
我遇到过这种情况几次。许多编程语言没有内置此类功能,对于不理解问题的人来说,它似乎只是另一个麻烦,特别是如果看起来没有使用它也能正常工作。

0

我完全同意上面提到的浮点数与十进制数正确性问题,但是许多金融应用程序对性能要求很高。

在这种情况下,您将考虑在不支持硬件十进制类型的系统中使用float/double,因为decimal对性能有很大影响。而且,仍然可以将浮点类型包装在更高级别的类(例如Tax、Commission、Balance、Dividend、Quote、Tick等)中,表示领域模型并封装所有舍入逻辑以及这些类型及其交互的有效运算符。 是的,在一些项目中,我已经实现了自定义舍入函数,相比于.NET或win32方法,可以挤出多达20%的计算量。

另一个需要考虑的事情是是否将对象传递到进程外,因为序列化通常是4个整数的十进制数,并将它们通过网络传输会占用更多的CPU资源(特别是如果不支持),并导致更大的带宽和内存占用。


0

我一直使用十进制。至少在我使用支持它的语言时是这样。否则,舍入误差会让你付出代价。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接