在 C# 中使用 System.Decimal 进行数学运算
Posted
技术标签:
【中文标题】在 C# 中使用 System.Decimal 进行数学运算【英文标题】:Math operations using System.Decimal in C# 【发布时间】:2011-08-18 19:17:54 【问题描述】:我需要能够对十进制数使用标准数学函数。准确性非常重要。 double
不是可接受的替代品。 C#中如何用十进制数实现数学运算?
编辑
我正在使用System.Decimal
。我的问题是System.Math
不适用于System.Decimal
。例如,以下函数不适用于System.Decimal
:
【问题讨论】:
你能定义标准的数学函数吗? 十进制类型呢? 您正在使用哪些数学函数,想放纵一下吗?我们在谈论地板和天花板?还是别的什么? 您认为什么是“十进制数”? 这个问题很模糊。你需要知道什么? 【参考方案1】:好吧,Double 使用 floating point 数学,除非你正在为 3D 图形或其他东西做三角函数,否则这不是你想要的。
如果你需要做简单的数学运算,比如除法,你应该使用System.Decimal。
来自 MSDN:decimal 关键字表示 128 位数据类型。与浮点类型相比,十进制类型的精度更高,范围更小,适用于金融和货币计算。
更新: 经过一番讨论,问题是您想使用小数,但 System.Math 仅将双精度数用于几个关键功能。遗憾的是,您使用的是高精度数字,由于 Decimal 是 128 位,而 Double 只有 64 位,因此转换会导致精度损失。
显然,有一些可能的计划让 System.Math 处理 Decimal 的大部分内容,但我们还没有。
我搜索了一下数学库并编译了这个列表:
Mathdotnet,一个用 C#/.Net 编写的数学开源(MIT/X11、LGPL 和 GPL)库,旨在为符号代数和数值/科学计算提供一个自包含的干净框架。
Extreme Optimization Mathematics Library for .NET(付费)
DecimalMath 一个相对较新的人,它自称:Microsoft 忘记了对 Decimal 的便携式数学支持等等。 听起来很有希望。
【讨论】:
我正在尝试使用 System.Decimal,但它不适用于 System.Math 算术,使用 Decimal,当你需要做 System.Math.Log 时,将其转换为 Double,然后再返回。 @Storm Kiernan:你肯定需要第三方库。显然这应该最终进入框架,但它还没有。我现在正在四处搜索。有一些 C 库,也许有一个 C# 包装器。 @JeffBridgman 不确定这里的协议是什么,但为了解决这个问题,我从那个已删除问题的答案中引入了相关内容,并尽我所能给予适当的评价。感谢您的提醒。 @RBarryYoung 谢谢 - 确认并更新。我还检查了下面提到的那个Ramin,它看起来可能值得一看。【参考方案2】:DecimalMath 包含System.Math
类中的所有函数,decimal
参数类比
注意:它是我的库,其中还包含一些示例
【讨论】:
如果你要推广你自己的图书馆,请给disclosure你写的。我假设您这样做是因为 GitHub 用户名与您的 SO 用户名匹配。举例说明您将如何完成 OP 想要的,而不仅仅是链接到您的库,这也会有所帮助。 是的,它是我的库,我根据自己的需要开发它并共同共享,我使用每个函数的泰勒级数和一些其他技巧重写数学库,我的意思是所有示例都与数学类相同,所以不需要额外的例子,但这可能是我的无知,没有透露它是我的 我真的很喜欢这个。【参考方案3】:您没有为我们提供几乎足够的信息来回答这个问题。
decimal 和 double 都不准确。当被表示的数量正好等于形式 (x/10n) 的分数时,小数的表示误差为 0 x 和 n 的选择。对于 x 和 n 的合适选择,当数量再次恰好等于形式 (x/2n) 的一部分时,双精度的表示误差为零。
如果您处理的数量不是该形式的分数,那么您将得到一些表示错误,句号。特别是,您提到取平方根。许多平方根是无理数;它们没有分数形式,因此任何使用分数的表示格式都会产生小错误。
你能更详细地解释一下你在做什么吗?
【讨论】:
-1 我认为这个问题提供了足够的信息。他正在使用小数,他想在计算中使用内置的 .NET 类运算,但它们只需要双精度数。以上是关于在 C# 中使用 System.Decimal 进行数学运算的主要内容,如果未能解决你的问题,请参考以下文章
将 ODP.Net 与 NHibernate 与 .net System.decimal 一起使用
无法将类型为“System.Decimal”的对象强制转换为类型“System.Char[]”。
The cast to value type 'System.Decimal' failed because the materialized value is null. Eithe