关于C#中Math.Pow不支持decimal这件事

2023年4月24日 682点热度 0人点赞 0条评论

.NetCore目前在金融计算这块的生态的确比不上Python,并没有太多的轮子可以拿来直接用,很多功能需要自己实现。于是最近就在尝试写一些资产绩效评价指标的模块,比如最大回撤,夏普比率,年化收益之类的东西,在这个过程中遇到了一些关于数据精度的问题,感觉是个坑,在这里记录一下。

数学计算方面,.NetCore中一般会使用System.Math这个库,在进行年化计算时要用到Pow这个幂函数,但Pow只支持double型入参,这就造成了明显的精度丢失,计算结果与期望结果相去甚远。

搜索了很多相关文章,都不是有效的解决办法,不过最后在百度文库里发现一个老哥推荐的第三方库,这才解决问题,说到底还是找到了一个轮子:

在Nuget里搜索Extreme.Mathematics,下载安装,其中的DecimalMath.Pow支持decimal,问题解决,记录备忘一下。

PS:发现Extreme.Mathematics是个收费的科学计算包,有2个月的试用期。在外网一通爬,又找到了一个解决Pow的decimal问题的Nuget包:DecimalMath.DecimalEx 。这是个免费的包,用decimal实现了Sqrt, Pow, Exp, Log函数,以及Sin, Cos, Tan, ASin, ACos, ATan, ATan2等三角函数。如下图:

Nuget安装后,using DecimalMath 。通过DecimalEx类调用相关函数,比如DecimalEx.Pow()等,计算结果我用Python进行了验证,没有问题。

QThinker

前地产从业者,假装是个程序员,热爱编程与交易 自研QThinker量化交易框架

文章评论