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