我想看看人们是否在金融应用程序中使用十进制而不是双精度。我见过很多人到处使用 double 并产生意想不到的后果。.
您是否看到其他人犯了这个错误。. .
我想看看人们是否在金融应用程序中使用十进制而不是双精度。我见过很多人到处使用 double 并产生意想不到的后果。.
您是否看到其他人犯了这个错误。. .
不幸的是,我们做到了,我们为此感到遗憾。我们必须将所有双精度数更改为小数。小数适用于金融应用。您可以查看这篇文章 A Money type for the CLR:
一种方便、高性能的 CLR 货币结构,它可以处理算术运算、货币类型、格式以及仔细分配和舍入而不会丢失。
这并不像你想象的那么明显。我最近让一家大公司的财务主管告诉我,他希望他的财务报告与 Excel 生成的结果相匹配,即在内部以最大精度保持计算结果,并且仅在最后一分钟四舍五入以进行显示。这意味着您不能总是通过仅使用显示值的手动计算来匹配 Excel 答案。他的解释是,有多种算法可以生成结果,每种算法都使用十进制值在不同的位置进行四舍五入,因此可能会生成相互冲突的答案,但 Excel 方法总是生成相同的答案。
我个人认为他是错的,但是有这么多财务人员使用 Excel 却不了解如何正确使用它进行财务计算,我敢打赌有很多人同意这个控制器。
我不想引发一场宗教战争,但我很想听听对此的其他意见。
如果是“科学”测量(我的意思是重量、长度、面积等),请使用双倍。
如果它是财务的,或者与法律有关(例如财产的面积),那么使用小数。
困难的部分是四舍五入。
如果税率为 2.4%,您是在细节中四舍五入还是在总和之后四舍五入?
大多数时候你必须两者都做(并修复差异)
我遇到过几次。许多语言都没有内置任何类型,对于不理解问题的人来说,这似乎只是另一个麻烦,特别是如果它看起来没有它就可以按预期工作。
我一直使用十进制。至少当我有一种支持它的语言时。否则,舍入错误会杀死你。
我完全同意上面提到的浮点与小数的正确性问题,但许多金融应用程序对性能至关重要。
在这种情况下,您将考虑使用浮点数/双精度数,因为在硬件不支持小数类型的系统中,十进制对性能有很大影响。仍然可以将浮点类型包装在表示域模型的更高级别的类(例如,Tax、Commission、Balance、Dividend、Quote、Tick 等)中,并封装所有舍入逻辑以及这些类型上的有效运算符以及他们的互动。是的 - 在一些项目中,我已经实现了自定义舍入函数,与 .NET 或 win32 方法相比,可以将计算量提高 20%。
要考虑的另一件事是您是否将对象传递到进程之外,因为序列化通常是 4 个整数的小数并通过网络传递它们会占用更多 CPU(尤其是如果不支持),并且会导致显着增加带宽和更大的内存占用。